饅頭山戰役極其慘烈,拂曉軍總部派出 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% |
解題思路
使用 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