ZeroJudge F634: 士兵歸來

饅頭山戰役極其慘烈,拂曉軍總部派出 N 位士官兵進行總攻擊,經過七天七夜的征戰,終於攻下了山頭。
存活的士官兵開始陸續返回部隊報到,軍總部希望能統計這場戰役生還的士官兵情況。然而情況有些複雜。

士官兵分屬不同的軍種:海軍 (navy):1、陸軍 (army):2、空軍 (air):3
且軍階不同:軍官 (officer):1、士官 (sergeant):2、士兵 (soldier):3

士官兵同一個人有重複登記的情況,更麻煩的是還有同名同姓的人 (若姓名、軍種、軍階都相同者視為同一個人),
軍總部發現這個工作是乎比攻山頭更困難,請幫忙寫一程式處理這項統計任務。

範例測資

範例輸入範例輸出
測資第一行有兩個整數 N 和 M
(1 <= N, M <= 1000,000)
第二行開始有 M 行,每行有字串 S、整數 A 和 B:
S:姓名 (小於 10 個字元, ‘A’~’Z’ 構成)
A:軍種 (海軍:1、陸軍:2、空軍:3)
B:軍階 (軍官:1、士官:2、士兵:3)
第一行輸出各軍種存活人數
第二行輸出各軍階存活人數
第三行輸出存活人數百分比 (小數點後 1 位)
15 10
ABC 1 2
ABC 2 1
ABC 2 1
ACD 3 3
ACD 1 2
ACD 1 1
BBC 2 1
BBC 1 2
BBC 1 2
BBE 3 3
navy:4 army:2 air:2
officer:3 sergeant:3 soldier:2
survival rate: 53.3%
ZeroJudge F634 範例測資

解題思路

使用 Map 來判斷每一個人是否已經登記過了,並且用 Map 來紀錄每一個軍種及軍階的人數。

Map 的 Key 值設定為 Pair<string, Pair<int, int>>,裡面分別存 S、A、B。

範例程式碼-ZeroJudge F634: 士兵歸來

#include <iostream>
#include <map>
#include <stdio.h>
using namespace std;

pair<string, pair<int, int>> rtn (string name, int a, int b)
{
    pair<string, pair<int, int>>tmp;
    tmp.first = name;
    pair<int, int>aa;
    aa.first = a;
    aa.second = b;
    tmp.second = aa;
    return tmp;
}

int main() {
    int N, M;
    cin >> N >> M;
    map<pair<string, pair<int, int>>, int>person;
    map<int, int>type;
    map<int, int>level;
    double survive = 0;
    for (int i = 0; i<M; i++)
    {
        string name;
        int a, b;
        cin >> name >> a >> b;
        if (person[rtn(name, a, b)] == 0)
        {
            type[a]++;
            level[b]++;
            survive++;
        }
        person[rtn(name, a, b)]++;
    }
    cout << "navy:" << type[1] << " army:" << type[2] << " air:" << type[3] << "\n";
    cout << "officer:" << level[1] << " sergeant:" << level[2] << " soldier:" << level[3] << "\n";
    double total = double(N);
    printf("survival rate: %.1f", survive/total*100);
    cout << "%\n";
}

//ZeroJudge F634
//Dr. SeanXD

發佈留言