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]会触发数组越界,这同样是未定义行为,可能在特定测试用例下导致崩溃或错误输出。
修复方法
初始化
cnt:
声明时直接赋值为0:int n,m,a,b,cnt = 0;或者在累加循环前手动初始化:
cnt = 0; for(int i=0;i<n;i++) { cnt+=arr[i]; }处理数组越界风险(可选但推荐):
确保循环次数不超过数组实际大小,修改循环条件为:int take = min(n, (int)arr.size()); for(int i=0;i<take;i++) { cnt+=arr[i]; }
内容的提问来源于stack exchange,提问作者Zainab Emad
相关产品推荐
相关产品推荐

