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; }
代码存在的问题
数组越界风险:
固定大小的grp数组(size=10000)无法适配所有测试场景。当输入中坏天气的次数超过10000时,count会超过数组下标范围,导致非法内存访问,破坏程序数据,引发错误。整数溢出问题:
结果变量ans和计算用的l均为int类型,当测试用例中连续好天气段长度很大时(比如1e5),计算出的组合数会远超int的最大值(约2e9),导致溢出,得到错误的结果。未处理最后一段好天气:
原代码在遍历结束后,没有处理最后一段未被坏天气中断的好天气,若这段长度满足条件,会遗漏其贡献。
修复后的代码
#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
相关产品推荐
相关产品推荐

