时隔多年再来看这题,居然不太会写了
思路:
应该都会想到设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