题目:尼克的任务
思路:
先倒序排序。
令f[i]表示i~n的工作时间中尼克可获得的最大空闲时间。
f[i]=max((f[i+a[h].t]),f[i]),h∈{ x | a[x].p == i }
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 10000
struct Work{
int p,t,q;
Work(int pp=0,int tt=0) {
p=pp,t=tt;
q=p+t;
}
bool operator <(const Work& B) const {
return p>B.p;
}
};
int n,k;
Work a[maxn+5];
int s[maxn+5]={0};
int f[maxn+5]={0};
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++){
int p,t;
scanf("%d%d",&p,&t);
a[i]=Work(p,t);
s[p]++;
}
sort(a+1,a+k+1);
int h=1;
for(int i=n;i>=1;i--){
if(!s[i]) f[i]=f[i+1]+1;
else {
for(int j=s[i];j>=1;j--){
f[i]=max((f[i+a[h].t]),f[i]);
h++;
}
}
}
printf("%d",f[1]);
return 0;
}