题目链接:https://www.luogu.com.cn/problem/P1280
设f[i]表示从i到n分钟尼克能获得的最大空闲时间。
倒序枚举,
如果第i个时刻开始有工作可以做,那么f[i]=max(f[i],f[i+v[i][j]]),其中v[i][j]表示第i时刻开始的第j项工作的耗时。
如果第i个时刻开始没有工作,那么f[i]=f[i+1]+1。
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<vector> 4 using namespace std; 5 const int N=10005; 6 int n,k,f[N]; 7 vector<int> v[N]; 8 int main(){ 9 scanf("%d%d",&n,&k); 10 for(int i=1;i<=k;i++){ 11 int p,t; 12 scanf("%d%d",&p,&t); 13 v[p].push_back(t); 14 } 15 for(int i=n;i>=1;i--){ 16 if(v[i].size()>0){ 17 for(int j=0;j<v[i].size();j++) f[i]=max(f[i],f[i+v[i][j]]); 18 } 19 else f[i]=f[i+1]+1; 20 } 21 printf("%d",f[1]); 22 return 0; 23 }