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

CodeForces 300A题C++代码无输出问题排查及解法求助

问题原因
  • 局部计数变量未初始化:代码中c1、c2、c3三个计数变量声明时未赋值为0,函数内局部自动变量默认值为内存随机垃圾值,后续累加操作值完全不可控,极易触发数组越界、程序崩溃,是无输出的直接原因。
  • 逻辑存在漏洞:未处理正数集合为空的场景,题目要求第二个集合乘积必须为正,若原数组没有正数,当前代码会输出长度为0的正数集合,不符合题目要求。
修正后可运行代码
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define ll long long

int main()
{ 
   ios_base::sync_with_stdio(false);
   cin.tie(NULL);
   ll n;
   cin >> n;
   vector<ll> v(n);
   for (ll i = 0; i < n; i++)
   {
      cin >> v[i];
   }
   ll c1 = 0, c2 = 0, c3 = 0;
   vector<ll> neg, pos, z;
   for (ll i = 0; i < n; i++)
   {
      if (v[i] == 0)
      {
         c3++;
         z.push_back(v[i]);
      }
      else if (v[i] < 0)
      {
         c1++;
         neg.push_back(v[i]);
      }
      else
      {
         c2++;
         pos.push_back(v[i]);
      }
   }
   // 调整负数个数为奇数,保证第一个集合乘积为负
   if (c1 % 2 == 0)
   {
       ll neg_num = neg.back();
       neg.pop_back();
       c1--;
       z.push_back(neg_num);
       c3++;
   }
   // 处理正数为空的情况,两个负数乘积为正满足第二个集合要求
   if (c2 == 0)
   {
       pos.push_back(neg.back()); neg.pop_back(); c1--;
       pos.push_back(neg.back()); neg.pop_back(); c1--;
       c2 += 2;
   }
   // 按格式输出
   cout << c1 << " ";
   for (ll i = 0; i < c1; i++)
   {
       cout << neg[i] << " ";
   }
   cout << endl;
   cout << c2 << " ";
   for (ll i = 0; i < c2; i++)
   {
      cout << pos[i] << " ";
   }
   cout << endl;
   cout << c3 << " ";
   for (ll i = 0; i < c3; i++)
   {
      cout << z[i] << " ";
   }
   return 0;
}
标准解题思路

题目要求将数组拆分为三个非空集合,满足第一个集合乘积为负、第二个为正、第三个为0,实现逻辑如下:

  1. 遍历原数组,将元素按负数、正数、零三类分别存入三个数组,同时统计每类的数量。
  2. 调整负数数组长度为奇数:如果负数总数是偶数,取一个负数放到零数组,保证第一个集合乘积为负。
  3. 处理无正数的特殊场景:如果正数数组为空,从负数数组取两个元素放到正数数组,两个负数相乘结果为正,满足第二个集合的乘积要求,同时剩余的负数个数仍为奇数,不会影响第一个集合的要求。
  4. 按格式输出三个集合的长度和对应元素即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:24:05