我们发现这道题是有后效性的……前面的决策会对后面的产生影响……

所以我们可以反向考虑

f [ i ] 表示第i分钟至第n分钟的最大空闲时间

理论上应该排个序,不过默认有序了……

转移方程:如果该时间有任务开始,f [ i ] = max( f [ i ],f [ i+e [ i ] ])

             如果没有任务,f [ i ]=f [ i+1] +1

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 using namespace std;
 5 int n,k,f[10001],b[10001],e[10001];
 6 int main(){
 7     int tmp;
 8     memset(f,0,sizeof(f));
 9     scanf("%d %d",&n,&k);
10     for (int i=1;i<=k;i++)
11         scanf("%d %d",&b[i],&e[i]);
12     for (int i=n;i>=1;i--){
13         tmp=0;
14         while (b[k]==i){
15             f[i]=max(f[i],f[i+e[k]]);
16             k--;tmp=1;
17         }
18         if (!tmp) f[i]=f[i+1]+1;
19     }
20     printf("%d",f[1]);
21     return 0;
22 }
STD

 

posted on 2016-09-19 20:54  Absolutezero  阅读(229)  评论(0编辑  收藏  举报