ZeroJudge F374: 分組 Grouping

某國正在進行世界錦標賽,吸引了各國好手前來參加。每個選手會被官方打上戰力指數,指數必為介於 0 到 9 的一位數,數字愈高代表官方人員覺得這位選手越有潛力。

假設有 4 位選手,A 的戰力指數是 0,B 是 4,C 是 0,D 是 3。經過抽籤後,選手的分組序列為 BCDA。分組時依序列由右往左分組。若一組有三人,選手 A、D|C 會編在第一組,此組的戰力總和為 0 + 3 + 0 = 3;選手 B 會編在第二組,此組的戰力總和為 4。

請你撰寫一個程式,依據每組人數以及參賽者的戰力指數來分析出戰力總和最高的組別編號和該戰力總和值

範例測資

範例輸入範例輸出
每一行輸入含有兩個數字 N (1 ≤ N ≤ 8) 和 P,一組有 N 個人,其中 P 為參賽者依分組序列將個別戰力指數組成的數字。已知最多不會超過 9 位參賽者,且最少會分出 2 組隊伍。保證序列最左邊選手的戰力指數絕對不會是 0。輸出分組完後戰力總和最高的組別編號與這個組別的戰力指數總和,兩個
數字之間以一個空白隔開。如果有多個組別戰力指數總和相同,則輸出組別數字較大的那一組。
1 3691 9
2 1934263 10
5 101213151 12
4 123443212 10

解題思路

可以將 P 使用字串的方式存起來,因為題目有講最多不會超過9位選手,所以可以使用reverse不用擔心會TLE,將字串反轉之後就使用 For迴圈 將每一個字元做判斷並且找出最大戰力總和的組別。

範例程式碼-ZeroJudge F374: 分組 Grouping

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    int N;
    string str;
    cin >> N;
    cin >> str;
    reverse(str.begin(), str.end());
    int count = 0, sum = 0, max = -999, team, cnt = 0;
    for (int i = 0; i<str.length(); i++)
    {
        sum += int(str[i] - '0');
        count++;
        if (count == N || i == str.length()-1)
        {
            count = 0;
            cnt++;
            if (sum >= max)
            {
                max = sum;
                team = cnt;
            }
            sum = 0;
        }
    }
    cout << team << " " << max << endl;
}

//ZeroJudge F374
//Dr. SeanXD

發佈留言