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(超时)

#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[200010];
int dfs(int x, int num)
{
    if (x == m) 
		return a[x] + num * num * num * num;
		
    return min(dfs(x + 1, num + 1),a[x]+dfs(x + 1, 1) + num * num * num * num);
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++)
        scanf("%d", &a[i]);
    cout << dfs(1, 1);
}

正解

#include <bits/stdc++.h>
using namespace std;
int n, m;
long long a[200010];
long long dp[200010];
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++)
        scanf("%lld", &a[i]);
    sort(a+1,a+1+m);
    for(int i=1;i<=m;i++) dp[i]=0x3f3f3f3f3f3f3f3f;
    for(int i=1;i<=m;i++){
    	//dp[i]=a[i]+1ll*i*i*i*i;爆long long了 
    	int j=0;
    	if(i>50) j=i-50;//因为4次方很大,所以bug的数量不可能留很多(减少枚举数量)
    	for(;j<i;j++){
    		dp[i]=min(dp[i],dp[j]+1ll*(i-j)*(i-j)*(i-j)*(i-j)+a[i]);
		}
	}
	cout<<dp[m];
}

wa的原因

1.爆long long了

2.运算过程中没转long long

总结

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

相关推荐
Microsoft Word16 分钟前
c++基础语法
开发语言·c++·算法
天才在此29 分钟前
汽车加油行驶问题-动态规划算法(已在洛谷AC)
算法·动态规划
莫叫石榴姐1 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
茶猫_2 小时前
力扣面试题 - 25 二进制数转字符串
c语言·算法·leetcode·职场和发展
肥猪猪爸4 小时前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
readmancynn5 小时前
二分基本实现
数据结构·算法
萝卜兽编程5 小时前
优先级队列
c++·算法
盼海5 小时前
排序算法(四)--快速排序
数据结构·算法·排序算法
一直学习永不止步5 小时前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
Rstln6 小时前
【DP】个人练习-Leetcode-2019. The Score of Students Solving Math Expression
算法·leetcode·职场和发展