题目描述:
请实现一个计票统计系统。你会收到很多投票,其中有合法的也有不合法的,请统计每个候选人得票的数量以及不合法的票数。
本题有多组样例输入。
输入描述:
输入候选人的人数n,第二行输入n个候选人的名字(均为大写字母的字符串),第三行输入投票人的人数,第四行输入投票。
输出描述:
按照输入的顺序,每行输出候选人的名字和得票数量,最后一行输出不合法的票数。
示例:
输入:
4
A B C D
8
A D E CF A GG A B
输出:
A : 3
B : 1
C : 0
D : 1
Invalid : 3
解题思路:
这题是个容器考察题。用vector存放候选人名字,用hash map容器flags存放候选人标志符,用values存放候选人票数;当进行投票时,判断下flags[vote]是否为true,若是则为候选人,有效票所以票数+1,若不是则无效票计数+1;最后按顺序输出vector即可。
这道题因为输出顺序与开始的候选人顺序一致,所以用vector来做好一些,如果要求输出结果按字母排序,最好用map,因为可以自动实现排序。
测试代码:
#include <iostream> #include <vector> #include <string> #include <unordered_map> #include <algorithm> using namespace std; int main() { int number; while(cin>>number) { vector<string> m(number); unordered_map<string, bool> flags(number); unordered_map<string, int> values(number); for(int i=0;i<number;++i) { string candidate; cin>>candidate; m[i]=candidate; flags[candidate]=true; } int n; cin>>n; int invalid=0; for(int j=0;j<n;++j) { string vote; cin>>vote; if(flags[vote]==true) { values[vote]++; } else{ invalid++; } } for(int j=0;j<number;++j) { cout<<m[j]<<" : "<<values[m[j]]<<endl; } cout<<"Invalid : "<<invalid<<endl; } return 0; }