洛谷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#include 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 >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<