UVA10684题解
翻译
多组数据,对于每组数据,第一行输入 ,表示元素的个数。若 为 ,则输入结束。接下来若干行共输入 个整数 ,表示每个元素。求 数组内的最大子段和 。若 为非正整数,则输出 Losing streak.。若 为正整数,则输出 The maximum winning streak is X.,其中 X 表示 。
思路
我的翻译里已经说明了,这题就是一道最大子段和的板子题,也是 P1115 的双倍经验。我们可以用 表示目前的最优答案,用 表示手头正在统计的答案,说白了就是个前缀和计数器。我们可以枚举每个元素 ,若 ,说明到目前为止,前面的内容对后面来说已经完全没用了,只会连累后面,这时候我们计数器归零。若 ,说明迄今为止,前面的内容对后面还是有用的,这时候,我们的计数器就加上 ,并对 取个 ,继续运算。一路枚举到最后就行了。
代码
# include <bits/stdc++.h>
using namespace std;
int n, x, ans, now;
int main () {
while (cin >> n, n) { //多组数据,且不知道有几组只有结束条件时可以这样写
ans = now = 0; //多组数据要初始化
while (n --) {
cin >> x;
now += x; //累加
if (now < 0) //没用,归零
now = 0;
else
ans = max (ans, now); //有用,那就取 max
}
if (ans > 0)
cout << "The maximum winning streak is " << ans << ".\n";
else
cout << "Losing streak.\n";
}
return 0;
}

浙公网安备 33010602011771号