You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CF16-D2-B问题:Codeforces编译器输出与Code::Blocks不一致

问题

代码在Code::Blocks及其他在线编译器上输出与测试用例完全一致,但在Codeforces平台上输出结果不同,怀疑存在未定义行为但无法定位问题。代码如下:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    int n,m,a,b,cnt;
    vector<int>arr;
    cin>>n>>m;

    for(int i=0;i<m;i++)
    {
        cin>>a>>b;
       arr.insert(arr.end(), a, b);

    }

  sort(arr.rbegin(), arr.rend());



    for(int i=0;i<n;i++)
    {
        cnt+=arr[i];

    }

    cout<<cnt;

    return 0;
}
问题原因

核心问题是变量cnt未初始化。C++中局部自动变量如果不手动赋值,初始值是内存里的随机垃圾值。在本地或部分在线编译器环境中,cnt可能刚好被分配到值为0的内存区域,所以计算结果正确;但Codeforces的编译环境中,cnt的初始随机值会被加入最终累加结果,导致输出错误——这属于标准明确的未定义行为,不同环境下未初始化变量的表现没有统一保证。

另外还有潜在风险:如果输入的所有a之和小于n,循环中访问arr[i]会触发数组越界,这同样是未定义行为,可能在特定测试用例下导致崩溃或错误输出。

修复方法
  1. 初始化cnt:
    声明时直接赋值为0:

    int n,m,a,b,cnt = 0;
    

    或者在累加循环前手动初始化:

    cnt = 0;
    for(int i=0;i<n;i++)
    {
        cnt+=arr[i];
    }
    
  2. 处理数组越界风险(可选但推荐):
    确保循环次数不超过数组实际大小,修改循环条件为:

    int take = min(n, (int)arr.size());
    for(int i=0;i<take;i++)
    {
        cnt+=arr[i];
    }
    

内容的提问来源于stack exchange,提问作者Zainab Emad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:52:05