1. 程式人生 > >洛谷1280 尼克的任務

洛谷1280 尼克的任務

define pre int nbsp namespace == ont node urn

  傳送門^o^

時隔多年再來看這題,居然不太會寫了

思路:

  應該都會想到設f[i]表示從1~i最大的空閑時間

  那麽如果i時刻有任務 f[i]=f[i-1]

  如果沒有任務 f[i]=f[i-1]+1

  但是這樣不知道怎麽處理啊

  正難則反啊!

  f[i]表示i~n最大空閑時間

  倒過來枚舉 發現f[i]和第i時刻開始的任務有關 就可以轉移啦

CODE:

技術分享圖片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define go(i,a,b) for(register int i=a;i<=b;i++)
 5
#define yes(i,a,b) for(register int i=a;i>=b;i--) 6 #define ll long long 7 #define db double 8 #define M 10000+10 9 using namespace std; 10 int read() 11 { 12 int x=0,y=1;char c=getchar(); 13 while(c<0||c>9) {if(c==-) y=-1;c=getchar();} 14 while(c>=0&&c<=9) {x=(x<<1
)+(x<<3)+c-0;c=getchar();} 15 return x*y; 16 } 17 int n,m,f[M],sm[M]; 18 struct node{int b,l;}a[M]; 19 bool cmp(node x,node y){return x.b>y.b;} 20 int main() 21 { 22 n=read();m=read(); 23 go(i,1,m) a[i].b=read(),a[i].l=read(),sm[a[i].b]++; 24 int k=1; 25 sort(a+1,a+m+1,cmp);
26 yes(i,n,1) 27 { 28 if(!sm[i]) f[i]=f[i+1]+1; 29 go(j,1,sm[i]) 30 {f[i]=max(f[i],f[i+a[k].l]);k++;} 31 } 32 printf("%d",f[1]); 33 return 0; 34 }
View Code

洛谷1280 尼克的任務