当前位置:   article > 正文

Toxel 与 PCPC II

Toxel 与 PCPC II

题目

Problem L. Toxel 与 PCPC II Toxel 正在参加 PCPC(Pokémon Center Programming Contest)比赛。它写的一段代码中有不少 bug,正在调试。这份代码总共有 n 行,而且经验丰富的 Toxel 已经知道了其中 m 行代码有 bug,并锁 定了这 m 行的具体位置。但是 Toxel 还需要进行一些调试以了解错误的具体细节并修复它们。 Toxel 会进行多次调试。每次调试时,Toxel 可以任选一个 i,使得程序从第 1 行开始,顺序运行完 第 i 行后退出。Toxel 可以通过这 i 行代码运行的一些输出结果来进行 debug。运行这 i 行代码总共需要 i 秒。接下来,Toxel 会一次性地 debug 这 i 行代码,并修复所有这 i 行中的所有 bug。bug 数量越多,修 复所需的时间也越多。设这 i 行代码中现存的 bug 数量为 x,那么 Toxel 需要 x 4 秒来 debug 并完成修 复。修复后,这 i 行代码中将不再存在任何 bug。 PCPC 的赛场争分夺秒。请你帮 Toxel 计算一下,它最短需要多少秒才能完成 debug,修复整个代 码中的所有漏洞? 输入格式 第一行包含两个整数 n,m(1 ≤ m ≤ n ≤ 2 × 105)。 第二行包含 m 个整数 a1, a2, . . . , am(1 ≤ a1 < a2 < · · · < am ≤ n),表示代码中所有有 bug 的行编 号。 输出格式 输出一行一个整数,表示答案。 样例 standard input standard output 3 2 1 3 6 1 1 1 2 20 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 221 提示 对于第一个样例,Toxel 应该选择先运行前 1 行代码,运行消耗 1 秒,debug 消耗 1 4 = 1 秒。接下来 Toxel 应该选择运行前 3 行代码,运行消耗 3 秒,debug 消耗 1 4 = 1 秒。总计消耗 1 + 1 + 3 + 1 = 6 秒。 对于第三个样例,Toxel 可以分别运行前 1, 2, 3, . . . , 13, 14, 16, 18, 20 行来得到最优解

做法

dfs(超时)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n, m;
  4. int a[200010];
  5. int dfs(int x, int num)
  6. {
  7. if (x == m)
  8. return a[x] + num * num * num * num;
  9. return min(dfs(x + 1, num + 1),a[x]+dfs(x + 1, 1) + num * num * num * num);
  10. }
  11. int main()
  12. {
  13. scanf("%d%d", &n, &m);
  14. for (int i = 1; i <= m; i++)
  15. scanf("%d", &a[i]);
  16. cout << dfs(1, 1);
  17. }

正解

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n, m;
  4. long long a[200010];
  5. long long dp[200010];
  6. int main()
  7. {
  8. scanf("%d%d", &n, &m);
  9. for (int i = 1; i <= m; i++)
  10. scanf("%lld", &a[i]);
  11. sort(a+1,a+1+m);
  12. for(int i=1;i<=m;i++) dp[i]=0x3f3f3f3f3f3f3f3f;
  13. for(int i=1;i<=m;i++){
  14. //dp[i]=a[i]+1ll*i*i*i*i;爆long long了
  15. int j=0;
  16. if(i>50) j=i-50;//因为4次方很大,所以bug的数量不可能留很多(减少枚举数量)
  17. for(;j<i;j++){
  18. dp[i]=min(dp[i],dp[j]+1ll*(i-j)*(i-j)*(i-j)*(i-j)+a[i]);
  19. }
  20. }
  21. cout<<dp[m];
  22. }

wa的原因

1.爆long long了

2.运算过程中没转long long

总结

只想到了dfs写法,没想到怎么转成dp,还想着能不能用二维或多维来处理bug的个数,但感觉行不通。结果题解直接两重for循环解决了。感觉是先确定dp数组的含义?本题dp数组的含义是前i行debug的最短时间。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/662360
推荐阅读
相关标签
  

闽ICP备14008679号