1.尼克的任务
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 10010 #define MAX 1<<30 #define V vector<int> using namespace std; typedef struct node{ int s,e; }node; node t[LEN]; int dp[LEN]; int st[LEN]; int cmp(node a,node b){ //用于递减排序,重定义大于符号 return a.s>b.s; } int main(){ // freopen("尼克的任务.txt","r",stdin); int n,k,i,j,m; I("%d %d",&n,&k); F(i,1,k+1){ I("%d%d",&t[i].s,&t[i].e); st[t[i].s]++; //记录起始时间点 } sort(t+1,t+1+k,cmp); //让时间结构体递减排序 for(i=n;i>=1;i--){ //对于时间,从后往前循环 if(st[i]==0){ //从后往前循环的过程中,没有没有查询到起始时间点 dp[i]=dp[i+1]+1; //dp数组表示 从i时刻往后的空闲时间 }else{ //查询到了起始时间点 for(m=1;m<=k;m++){ //对所有任务进行遍历 if(t[m].s==i){ //遍历到的任务的其实时间点是当前时间点 dp[i]=max(dp[i],dp[i+t[m].e]); } //找出所有i时间开始的任务,记录他们结束时 最大的空闲时间 } } } O("%d\n",dp[1]); return 0; }