洛谷p1280 尼克的任务
题意:给出尼克工作时间长m,以及其 n个任务的开始时间和持续时间,尼克从1开始工作到m,若当前时间点为其中某任务开始时间尼克必须进行此任务,若有多个任务尼克选择其中一个执行,尼克未工作的时间为空闲时间,求最大空闲时间;
解法:因为前面选择的任务会影响到后来对任务的选择,难以得出其状态之间的转移变化,所以从后往前进行对任务的选择;
dp[i]表示i~m可得到的最大空闲时间
可得状态转移方程:
当前时间点无任务 dp[i]=1+dp[i+1];
当前时间点有任务 dp[i]=max(dp[i],dp[i+b[j]]);b[j]为任务持续时间;若有多个任务则进行多次判断即可;
#include<iostream>
#include<algorithm>
using namespace std;
struct dop{
int a;
int b;
bool operator <(const dop x)const{
return a>x.a;
}
}task[10005];
int n,m,dp[10005],t;
int main(){
cin>>m>>n;
for(int i=0;i<n;i++)
cin>>task[i].a>>task[i].b;
sort(task,task+n);
for(int i=m;i>0;i--){
if(task[t].a!=i) dp[i]=dp[i+1]+1;
else{
while(task[t].a==i){
dp[i]=max(dp[i],dp[i+task[t].b]);
t++;
}
}
}
cout<<dp[1]<<endl;
return 0;
}

浙公网安备 33010602011771号