解:以工作开始的时间为关键字降序排序,从后面开始dp,若没有任务,则当前休息时间为后面加1(dp[i] = dp[i+1] + 1)
若有任务,则取当前dp和工作之后的dp比较取较大的,即 (if(dp[i+work[num].t]>dp[i]) dp[i]=dp[i+work[num].t]; )
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
const int N = 10005 ;
long long pre[N] , dp[N] ;
struct node{
long long s , t ;
}work[N] ;
bool cmp(node a , node b){
return a.s > b.s ;
}
int main(){
long long n , m ;
scanf ("%lld%lld",&n,&m) ;
memset(work,0,sizeof(work)) ;
memset(pre,0,sizeof(pre)) ;
for (long long i = 1 ; i <= m ; i ++){
scanf("%lld%lld",&work[i].s,&work[i].t) ;
pre[work[i].s] ++ ;
}
sort(work+1,work+1+m,cmp) ;
long long num = 1 ;
for (long long i = n ; i >= 1 ; i --){
if (pre[i]== 0)
dp[i] = dp[i+1] + 1 ;
else {
for(long long j = 1 ; j <= pre[i] ; j++) {
if(dp[i+work[num].t]>dp[i])
dp[i]=dp[i+work[num].t];
num++;//当前已扫过的任务数
}
}
}
printf ("%lld\n",dp[1]);
return 0 ;
}