倒着推
此时有任务(不在工作状态)就必须选 有很多个就选一个 所以当这个时间如果有很多的任务同时开始 我们要选取最优的那个取决这个任务结束后的情况
然后差不多就有两种情况 第一种是去工作的最大贡献时间 第二种就是不去工作 那么空闲时间就加1
代码如下
#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<string>
using namespace std;
#define in = read();
typedef long long ll;
typedef unsigned int ui;
const ll size = 10000 + 100;
int n , k;
int p[size] , t[size];
bool exist;
int f[size];
inline ll read(){
ll num = 0 , f = 1; char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)){
num = num*10 + ch - '0';
ch = getchar();
}
return num*f;
}
int main(){
n in; k in;
for(register int i=1;i<=k;i++){
p[i] in; t[i] in;
}
for(register int i=n;i>=1;i--){
exist = false;
for(register int j=1;j<=k;j++)
if(p[j] == i){
f[i] = max(f[i] , f[i + t[j]]);
exist = true;
}
if(!exist) f[i] = max(f[i] , f[i + 1] + 1);
}
printf("%d" , f[1]);
return 0;
}
//COYG