ZeroJudge F634: 士兵歸來

題目敘述

每筆測資第一行有兩個正整數N和M,N代表一開始有幾個人上了戰場,接下來會有M行,每行代表一個戰後登記活著的士兵,會有一個字串 (士兵名稱) 和兩個正整數 (代表軍種和軍階),會有重複登記的情況 (同名、同軍種、同軍階視為同一個人)。要求輸出各軍種和軍階存活的人數和存活率 (四捨五入至小數點第一位),輸出格式請參照輸出範例。


範例輸入 #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

範例輸出 #1

navy:4 army:2 air:2

officer:3 sergeant:3 soldier:2

survival rate: 53.3%


解題思路

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

解題程式碼如下 (僅供參考):

#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 M933: 邏輯電路

ZeroJudge A148: You Cannot Pass?!

ZeroJudge A263: 日期差幾天