洛谷1280 尼克的任务

  传送门^o^

时隔多年再来看这题,居然不太会写了

思路:

  应该都会想到设f[i]表示从1~i最大的空闲时间

  那么如果i时刻有任务 f[i]=f[i-1]

  如果没有任务 f[i]=f[i-1]+1

  但是这样不知道怎么处理啊

  正难则反啊!

  f[i]表示i~n最大空闲时间

  倒过来枚举 发现f[i]和第i时刻开始的任务有关 就可以转移啦

CODE:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define go(i,a,b) for(register int i=a;i<=b;i++)
 5 #define yes(i,a,b) for(register int i=a;i>=b;i--)
 6 #define ll long long
 7 #define db double
 8 #define M 10000+10
 9 using namespace std;
10 int read()
11 {
12     int x=0,y=1;char c=getchar();
13     while(c<'0'||c>'9') {if(c=='-') y=-1;c=getchar();}
14     while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
15     return x*y;
16 }
17 int n,m,f[M],sm[M];
18 struct node{int b,l;}a[M];
19 bool cmp(node x,node y){return x.b>y.b;}
20 int main()
21 {
22     n=read();m=read();
23     go(i,1,m) a[i].b=read(),a[i].l=read(),sm[a[i].b]++;
24     int k=1;
25     sort(a+1,a+m+1,cmp);
26     yes(i,n,1)
27     {
28         if(!sm[i]) f[i]=f[i+1]+1;
29         go(j,1,sm[i])
30         {f[i]=max(f[i],f[i+a[k].l]);k++;}
31     }
32     printf("%d",f[1]);
33     return 0;
34 }
View Code

猜你喜欢

转载自www.cnblogs.com/forward777/p/10339712.html
今日推荐