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

求优化水壶最大装水量计算代码:22个测试用例中5个性能用例失败

优化代码解决性能与溢出问题

嘿,我来帮你排查一下问题!你的代码逻辑其实是正确的,但有两个关键问题导致了部分性能测试失败甚至计算错误,咱们一步步来解决:

先回顾你的问题

桌面上有N个水壶,每个水壶的容量为C[i]。每个水壶装水后,第1个到第N个水壶的水量需满足非递增顺序,即对于1 ≤ i < N,水壶i中的水量A[i] ≥ A[i+1]。求所有水壶可装入的最大总水量?

输入格式:第一行输入测试用例数T。每个测试用例中,第一行输入水壶数量N,第二行输入N个空格分隔的整数C[i]。

输出格式:每个测试用例输出一行,为所有水壶可装入的最大总水量。

你的代码存在的问题

1. 整数溢出错误

你的answer变量使用了int类型,但如果水壶数量N很大(比如105),每个水壶容量C[i]是109的话,总水量会达到1014,远远超过`int`的最大取值范围(通常是231-1≈2×10^9),这会导致整数溢出,计算结果完全错误,这是部分测试用例失败的核心原因之一。

2. 输入输出效率低下

默认情况下,cin会与C语言的stdio库同步,这会大幅降低输入速度。当测试用例数量多或者每个测试用例的水壶数量很大时,这种同步机制会拖慢程序运行速度,导致性能测试超时失败。

优化后的代码方案

#include<bits/stdc++.h>
using namespace std;
int main() {
    // 关闭cin与stdio同步,解除cin和cout绑定,大幅提升输入输出速度
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int testCases;
    cin >> testCases;
    while(testCases--) {
        int jugs;
        cin >> jugs;
        long long answer = 0; // 改用long long避免溢出
        int current_limit; // 重命名变量,更清晰表示当前水壶的最大装水上限
        cin >> current_limit;
        answer = current_limit;
        
        for(int i = 1; i < jugs; i++) {
            int c;
            cin >> c;
            if(c < current_limit) {
                current_limit = c;
            }
            answer += current_limit;
        }
        cout << answer << "\n";
    }
    return 0;
}

额外优化建议

  • 如果你的测试用例中N达到10^6级别,还可以考虑一次性读取所有输入到内存缓冲区再处理,进一步提升速度,但上面的优化已经足够应对绝大多数性能测试场景。
  • 变量名current_limit比原来的minCapacity更贴合逻辑,它表示当前水壶能装的最大水量上限(因为要满足非递增规则,不能超过前一个水壶的水量),代码可读性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:07:38