POJ 3171 區間覆蓋最小代價)

2021-06-11 06:47:14 字數 1729 閱讀 3619

language:

default

cleaning shifts

time limit:1000ms

memory limit:65536k

total submissions:2093

accepted:735

description

有n (1 <= n <= 10,000)個區間,求覆蓋[m,e](0 <= m <= e <= 86,399)的最小代價.

每個區間的代價為s (where 0 <= s <= 500,000).

input

第一行3個整數: n, m, e. 

第二行到第n+1行,每行3個數,分別表示第i-1個區間的左端點t1,右端點t2,和代價s.

output

僅一行表示最小代價,無解輸-1.

sample input

3 0 4

0 2 3

3 4 2

0 0 1

sample output

5
hint

樣例解釋

取第乙個和第二個區間。

source

usaco 2005 december silver

這題是乙個dp問題,先列出dp方程。

f[i]表示取[m,i]這個區間的代價

顯然f[m-1]=0,答案就是f[e]

則方程為f[a[i].t2]=min(f[j])+a[i].s (t1-1<=j<=t2-1)

a[i]按t2從小到大排列;

那麼顯然a[i]取時,[m,t1-1]已經被前面的給取了,

因為如果被後面的[t1,t2] 取了,那麼必有t1

取最小的數可以用線段樹做o(nlogn)。

#include#include#include#include#include#include#include#includeusing namespace std;

#define maxn (10000+10)

#define maxe (86399)

#define maxs (500000+10)

#define inf (9187201950435737471)

int n,s,e;

struct segment

segment(int _l,int _r,long long _s):l(_l),r(_r),s(_s){}

friend bool operator<(const segment a,const segment b)

void insert(int x,long long c) }

long long find(int l,int r)

return ans;

}}t;

int main()

{// freopen("poj3171.in","r",stdin);

scanf("%d%d%d",&n,&s,&e);

for (int i=1;i<=n;i++) scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].s);

sort(a+1,a+1+n);

t.fillchar(e);

t.insert(s-1,0);

for (int i=1;i<=n;i++)

{ if (a[i].r

LintCode 1668 區間最小覆蓋

1668.區間最小覆蓋 cat 專屬題目 數軸上有 n 個區間.現在需要在數軸上選取一些點,使得任意乙個區間內至少包含乙個點.返回最少選取的點的數目.樣例樣例 1 輸入 1,5 4,8 10,12 輸出 2 解釋 選擇兩個點 5,10 第乙個區間 1,5 包含了 5 第二個區間 4,8 包含了 5 ...

1751 區間覆蓋問題

time limit 1000 ms memory limit 65536 kib problem description 設x1 x2 xn 是實直線上的n 個點。用固定長度的閉區間覆蓋這n 個點,至少需要多少個這樣的固定長度閉區間?對於給定的實直線上的n個點和閉區間的長度k,設計解此問題的有效演...

4 10區間覆蓋問題

問題描述 設x2,x2,xn是實直線上的n個點。用固定長度的閉區間覆蓋著n個點,至少需要多少個這樣的長度閉區間?設計解決此問題的有效演算法。演算法設計 對於給定的實直線上的n個點和閉區間的長度k,計算覆蓋點集的最少區間數。資料輸入 第一行有兩個整數n和k,表示有n個點,且固定長度閉區間的長度為k。接...