洛谷1280 尼克的任務
阿新 • • 發佈:2019-01-30
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++) 5View Code#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 }
洛谷1280 尼克的任務