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 4sample output0 2 3
3 4 2
0 0 1
5hint
樣例解釋
取第乙個和第二個區間。
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。接...