題目敘述
每筆測資第一行有兩個正整數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";
}
留言
張貼留言