华为机试HJ94:记票统计
Posted 翟天保Steven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试HJ94:记票统计相关的知识,希望对你有一定的参考价值。
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
题目描述:
请实现一个计票统计系统。你会收到很多投票,其中有合法的也有不合法的,请统计每个候选人得票的数量以及不合法的票数。
本题有多组样例输入。
输入描述:
输入候选人的人数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;
}
以上是关于华为机试HJ94:记票统计的主要内容,如果未能解决你的问题,请参考以下文章