• 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的最短时间。

  • 相关阅读:
    yolov8-pose的数据集标注
    【Vue】用Vue代码详细介绍computed计算属性的用法
    python 操作 excel
    岩土工程监测中的振弦采集仪选择与布设策略
    Java中的自定义异常
    中软国际:战略携手三大伙伴,三线出击收割AI红利
    关系数据库系统中的 NULL 值及其用途
    基于 Vite + Vue3 + TS + sass + router + element-plus 的项目搭建
    复刻一个羊了个羊掘金商城版
    YOLO系列目标检测算法——PP-YOLO
  • 原文地址:https://blog.csdn.net/2301_80718054/article/details/139336880