[关闭]
@AkamemakA 2022-08-28T03:31:39.000000Z 字数 1721 阅读 134

Atcoder 题解

Atcoder Beginner Contest 266 problem D 题解


题目链接:点我

题目大意

一条路上有个格子,分别是。一共有条蛇,每条蛇有三个属性:分别表示这条蛇的出现的时间,出现的位置和这条蛇的价值。

现在,一个人要来抓蛇。他初始在的位置。每一秒钟,这个人可以向前一格,向后一格,或者在原地不动。第条蛇会在的时间从的格子钻出来。如果此时这个人恰好在的位置,那么他就可以抓住这条蛇,并获得它的价值。问这个人可以获得的总价值最大是多少?

样例输入1

  1. 3
  2. 1 0 100
  3. 3 3 10
  4. 5 4 1

样例输出1

  1. 101

样例解释1

总价值为,这是最大的了。

样例输入2

  1. 3
  2. 1 4 1
  3. 2 4 1
  4. 3 4 1

样例输出2

  1. 0

样例输入3

  1. 10
  2. 1 4 602436426
  3. 2 1 623690081
  4. 3 3 262703497
  5. 4 4 628894325
  6. 5 3 450968417
  7. 6 1 161735902
  8. 7 1 707723857
  9. 8 2 802329211
  10. 9 0 317063340
  11. 10 2 125660016

样例输出3

  1. 2978279323

数据范围


解析

本蒟蒻看到这道题,第一反应是贪心,并且分了两种情况来贪:

  1. 根据时间贪心
  2. 根据价值贪心

不过,本蒟蒻很快就 Hack 掉了贪心,证明如下:

1.如果根据时间贪心,那么这组数据就不正确:

  1. 2
  2. 4 54 1
  3. 5 0 100

根据时间来看,我们应该走到号格子得到价值。但实际上,我们如果一直待着不动,那么我们会得到价值。显然后者更优,但并不满足时间贪心的条件。

2.如果根据价值贪心,那么这组数据就不正确:

  1. 3
  2. 4 4 5
  3. 6 1 2
  4. 7 0 4

根据价值贪心的话,我们会选择走到号格子得到价值,然后就得不到更多价值了。但实际上,若果我们只走到号格子上并等待到秒,然后第秒再走到号格子,这样可以抓住两条蛇得到价值。显然后者更优,但并不满足价值贪心的条件。

至此,贪心全面崩盘。

贪心不行,那肯定就是来凑了嘛!我们观察到时间是严格递增的,给出的格子数目又很小,于是,我们可以定义一下状态:

表示第秒时这个人在号格子时能获得的最大价值数。

由于这个人每秒可以选择做三件事,于是数组可以这样转移:

如果说在时间,格子上刚好有一条蛇出现的话,那么就要加上这条蛇的价值:

表示时间出现的是第几条蛇。可以用二分求得。


代码实现

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. const int N=1e5+5;
  5. int n;
  6. int t[N],x[N],w[N];
  7. long long ans,f[N][6];//注意数据范围,要用long long存储答案
  8. int main()
  9. {
  10. cin>>n;
  11. for(int i=1;i<=n;i++)
  12. cin>>t[i]>>x[i]>>w[i];
  13. memset(f,-0x3f,sizeof f);
  14. f[0][0]=0;//初始化。0时间时在0号格子,什么也没做,所得到的的价值是0
  15. for(int i=1;i<=t[n];i++){
  16. int res=lower_bound(t+1,t+n+1,i)-t,X,W;
  17. if(t[res]!=i) X=233;
  18. else X=x[res],W=w[res];//用二分找到当前时间是否有蛇
  19. for(int j=0;j<=4;j++){
  20. f[i][j]=max(f[i-1][j+1],max(f[i-1][j-1],f[i-1][j]));
  21. if(X==j) f[i][j]+=W;//如果有蛇,加上价值
  22. }
  23. }
  24. for(int i=0;i<=4;i++) ans=max(ans,f[t[n]][i]);//对五个格子都要扫一遍,找到最大值
  25. cout<<ans;
  26. }

完结撒花~~~

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注