本題考點:
- map 的應用
不少航空公司都會提供優惠的會員服務,當某顧客飛行里程累積達到一定數量後,可以使用里程積分直接兌換獎勵機票或獎勵升艙等服務。現給定某航空公司全體會員的飛行記錄,要求實現根據身份證號碼快速查詢會員里程積分的功能。
輸入格式:
輸入首先給出兩個正整數N(≤105)和K(≤500)。其中K是最低里程,即爲照顧乘坐短程航班的會員,航空公司還會將航程低於K公里的航班也按K公里累積。隨後N行,每行給出一條飛行記錄。飛行記錄的輸入格式爲:18位身份證號碼(空格)飛行里程。其中身份證號碼由17位數字加最後一位校驗碼組成,校驗碼的取值範圍爲0~9和x共11個符號;飛行里程單位爲公里,是(0, 15 000]區間內的整數。然後給出一個正整數M(≤105),隨後給出M行查詢人的身份證號碼。
輸出格式:
對每個查詢人,給出其當前的里程累積值。如果該人不是會員,則輸出No Info。每個查詢結果佔一行。
本題是 map
數據結構的應用,只需要掌握好 map
的常用方法即可,仔細,注意輸入最好用 scanf
、printf
,要比 cin,cout
更快。
完整代碼實現如下:
#include <iostream>
#include <string>
#include <map>
using namespace std;
int N, K; // 會員數目,最低里程數
map<string, int> members;
int main()
{
scanf("%d%d", &N, &K);
char number[20];
string num;
int dis;
while (N--)
{
scanf("%s%d", number, &dis);
if(dis > 0)
dis = max(K, dis); // 至少算作 500
num = string(number);
if (members.find(num) == members.end())
members[num] = dis;
else
members[num] += dis;
}
int count;
cin >> count;
while (count--)
{
scanf("%s", number);
num = string(number);
if (members.find(num) != members.end())
{
printf("%d\n", members[num]);
}
else
{
printf("No Info\n");
}
}
return 0;
}