【发布时间】:2019-01-02 13:06:07
【问题描述】:
伙计们,我是竞争性编程的新手,我正在解决一个问题 (455A BOREDOM),我采用了一个解决方案并尝试理解它。我相信我很了解这一点,但我有一点疑问。
#include<bits/stdc++.h>
using namespace std;
#define MAX 100005
long long dp[100005];
long long count1[100005];
int main(){
int n,x;
cin>>n;
for(int i=0;i<n;i++){
cin >> x;
count1[x]++;
// res=max(res,x);
}
dp[0]=0;
dp[1]=count1[1];
for(int i=2;i<MAX;i++){
dp[i]=max(dp[i-1],dp[i-2]+i*count1[i]);
}
cout<<dp[MAX-1];
}
但是,您可以看到循环运行 MAX(100005),即使对于小型测试用例也是如此。当我尝试优化时,我想出了以下解决方案:
#include<bits/stdc++.h>
using namespace std;
int main(){
long long dp[100005];
long long count1[100005];
int n;
cin>>n;
int x;
int res=-100000;
for(int i=0;i<n;i++){
cin >> x;
count1[x]++;
res=max(res,x);
}
dp[0]=0;
dp[1]=count1[1];
for(int i=2;i<=res;i++){
dp[i]=max(dp[i-1],dp[i-2]+i*count1[i]);
}
cout<< dp[res];
}
但是,这在测试用例 12 https://codeforces.com/contest/455/submission/47841668 上给了我错误的答案
该站点在测试用例 12 上报告了以下错误:
运行时错误:有符号整数溢出:98997 * 8608623459288743937 不能用“long long”类型表示
在这条线上dp[i]=max(dp[i-1],dp[i-2]+i*count1[i]);
谁能告诉我哪里做错了? 为什么那个有竞争力的程序员犯这种错误很正常?
【问题讨论】:
-
竞争性编程是一堆废话。相反,给自己买一本关于 C++ 的好书,并学习如何用真实世界的代码解决现实世界的问题。
-
您可能应该包含故障诊断和测试用例。该站点告诉您问题是什么运行时错误:有符号整数溢出:98997 * 8608623459288743937 不能用类型'long long'表示在这一行
dp[i]=max(dp[i-1],dp[i-2]+i*count1[i]); -
请注意,当您将变量移动到 main() 内的本地范围时,它们不再初始化为 0,而是作为全局变量。所以 count 充满了垃圾数据。