【问题标题】:Unexpected failed test case for codeforces 455A boredomcodeforces 455A 的意外失败测试用例无聊
【发布时间】: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 充满了垃圾数据。

标签: c++ dynamic-programming


【解决方案1】:

不同之处在于,现在您将long long count1[100005]; 移动到int main() 内部,它不再默认初始化为0,就像它是一个全局变量时那样。

Why are global and static variables initialized to their default values?

所以当你这样做时

for(int i=0;i<n;i++){
    cin >> x;
    count1[x]++;
    res=max(res,x);
}

count1[x] 具有随机垃圾值,您可以在此处递增然后在计算中使用这些值:dp[i]=max(dp[i-1],dp[i-2]+i*count1[i]),这会导致站点报告您的运行时错误:

运行时错误:有符号整数溢出:98997 * 8608623459288743937 无法在此行的“long long”类型中表示 dp[i]=max(dp[i-1],dp[i-2]+i*count1[ i]);

可以看到本例中的count1[i]是8608623459288743937

要解决此问题,您可以将 long long count1[100005]; 替换为 long long count1[100005]= {};

How to initialize all members of an array to the same value?

注意:dp 也不会自动初始化为 0。但这不是问题,因为您不会像使用 count1 那样读取 dp 的未初始化值。 dp[i-1]dp[i-2]在这里使用的时候已经被初始化了dp[i]=max(dp[i-1],dp[i-2]+i*count1[i]);

【讨论】:

  • 非常感谢您写了这样一个有用的答案
  • @akash12121 请不要对所有人大喊大叫!
猜你喜欢
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 2018-12-02
  • 1970-01-01
相关资源
最近更新 更多