链接:Miku
---------------
这道题给了我一个惨痛的教训
虽然说我是被学信息学不用写字吸引的,但是做题必须证明,必须动笔证明!
本蒟蒻被绿题卡了3个小时有感
--------------
这道题最后写出来发现并不是怎么很难啊,为了无后效性,我们倒着搜索每一个任务,因为任务的特殊要求,我们开一个数组记录这个时候的
开始的任务数。对于每一个时间,只有两种情况,有任务从这里开始或者没有,所以判断一下
----------------
dp[i]为i-n的最大空闲时间
----------------
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,k; struct ta{ int f;int p; int st; } tas[10001]; int x,y; int dp[10001]; int fl[10001]; bool cmp(ta x,ta y){ return x.p>y.p; } int fla; int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=k;++i){ scanf("%d%d",&x,&y); tas[i].p=x; tas[i].f=y+x-1; tas[i].st=y; fl[x]++; } sort(tas+1,tas+1+k,cmp); fla=1; for(int i=n;i>=1;--i){ if(!fl[i]) dp[i]=dp[i+1]+1; else{ // dp[i]=0x7f7f7f; for(int j=1;j<=fl[i];++j){ dp[i]=max(dp[i],dp[tas[fla].f+1]); fla++; } } } cout<<dp[1]; return 0; }