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

Codeforces 1840/C题代码测试用例6失败,求排查边界情况

Codeforces 1840/C题(Ski Resort)测试用例6失败排查

我正在解决Codeforces上的1840/C题(Ski Resort),编写的代码能通过所有样例输入,但提交后显示测试用例6失败,不清楚遗漏了哪些边界情况,希望找出问题。示例输入对应的条件为:最小连续天数为2,好天气最高温度为12度。

原代码实现如下:

#include<iostream>
#include<string>
using namespace std;

int main(){

    int t;
    cin>>t;

    for(int i=0; i<t; i++){
        int n, k, q;
        cin>>n>>k>>q;
        int size=10000;  // 创建存储连续好天气天数的大数组
        int grp[size]={0};
        int count=0;
        for(int j=0; j<n; j++){        //填充数组
            int num;
            cin>>num;
            if(num>q){                  
                count++;
            }else{
                grp[count]++;
            }
        }

        int ans=0;
        for(int j=0; j<size; j++){   //计算每个连续好天气段的可能组合数并累加
            int l = grp[j]-k+1;        
            if(l<1){continue;}        
            ans+=l*(l+1)/2;
        }
        cout<<ans<<endl;
        
    }


    return 0;
}

代码存在的问题

  1. 数组越界风险:
    固定大小的grp数组(size=10000)无法适配所有测试场景。当输入中坏天气的次数超过10000时,count会超过数组下标范围,导致非法内存访问,破坏程序数据,引发错误。

  2. 整数溢出问题:
    结果变量ans和计算用的l均为int类型,当测试用例中连续好天气段长度很大时(比如1e5),计算出的组合数会远超int的最大值(约2e9),导致溢出,得到错误的结果。

  3. 未处理最后一段好天气:
    原代码在遍历结束后,没有处理最后一段未被坏天气中断的好天气,若这段长度满足条件,会遗漏其贡献。

修复后的代码

#include<iostream>
using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int t;
    cin>>t;
    while(t--){
        int n, k, q;
        cin>>n>>k>>q;
        long long ans = 0;
        int current_good = 0;
        for(int j=0; j<n; j++){
            int num;
            cin>>num;
            if(num <= q){
                current_good++;
            }else{
                // 计算当前好天气段的贡献
                if(current_good >= k){
                    long long l = current_good - k + 1;
                    ans += l * (l + 1) / 2;
                }
                current_good = 0;
            }
        }
        // 处理遍历结束后剩余的好天气段
        if(current_good >= k){
            long long l = current_good - k + 1;
            ans += l * (l + 1) / 2;
        }
        cout<<ans<<'\n';
    }
    return 0;
}

修复说明

  • 移除固定大小数组,改用current_good变量实时跟踪当前连续好天气天数,遇到坏天气时立即计算该段贡献,无需存储所有段数据,避免越界问题。
  • 使用long long类型存储结果和中间计算值,避免整数溢出。
  • 增加遍历结束后的判断,处理最后一段未被中断的好天气段,确保所有符合条件的子段都被计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:12:50