同題:UVa 10684 – The jackpot
有一個人想要快速的致富而且不用太辛苦工作,他決定要在以賭場作為生涯職場。所以他開始研究別的賭客輸贏的情況,這樣他才能制訂一個贏的策略。由於他不懂電腦,所以他雇用你寫一個程式來幫助他。
你首先的任務是寫一個程式在一連串的賭局中辨識出連續的賭局最大可能贏的錢。每場賭局以一個整數來表示贏或輸的金額。正數代表贏,負數代表輸。
例如:有 6 局賭局金額如下:
-99 10 -9 10 -5 4
連續的賭局最大可能贏的錢為 11,出現在第 2、3、4 這連續三局中。
範例測資
範例輸入 | 範例輸出 |
---|---|
EOF 輸入,每組測試資料的第一列有一個正整數 N <= 10000,代表數列的長度。接下來有 N 個整數 (絕對值小於 1000),代表這 N 局賭局輸贏的金額。 當 N = 0 代表輸入結束。請參考 Sample Input。 | 對每組測試資料輸出一列,在這 N 局賭局中,連續的賭局最大可能贏的錢是多少。 如果輸入的資料不可能贏錢,則輸出「Losing streak.」。 輸出格式請參考Sample Output。 |
6 -99 10 -9 10 -5 4 3 -999 100 -9 5 12 -4 -10 4 9 3 -2 -1 -2 0 | The maximum winning streak is 11. The maximum winning streak is 100. The maximum winning streak is 13. Losing streak. |
解題思路
使用陣列先將資料收起來,再來跑一個 For 迴圈,這個是每次計算的「起點」,要從 i = 0 跑到 i = N-1。裡面還需要一個 For 迴圈,要從 j = i 跑到 j = N-1,代表要從起點 i 開始加到最後的終點。
可以預設一個 ans 變數為 -9999,每一次有相加動作時就和 ans 比大小,如果目前相加的數字比 ans 大就將其設為 ans。
最後判斷 ans 是否有 > 0,如果有就輸出 ans,沒有就輸出「Losing streak.」。
範例程式碼-ZeroJudge A540: The jackpot
#include <iostream>
#include <vector>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int N;
while (cin >> N && N != 0)
{
vector<int>num;
int ans = -9999;
for (int i = 0; i<N; i++)
{
int tmp;
cin >> tmp;
num.push_back(tmp);
}
for (int i = 0; i<N; i++)
{
int sum = 0;
for (int j = i; j<N; j++)
{
sum += num[j];
ans = max(ans, sum);
}
}
if (ans > 0)
{
cout << "The maximum winning streak is " << ans << ".\n";
continue;
}
cout << "Losing streak.\n";
}
}
//ZeroJudge A540
//Dr. SeanXD