求优化水壶最大装水量计算代码: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
相关产品推荐
相关产品推荐

