华为机试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:记票统计的主要内容,如果未能解决你的问题,请参考以下文章

华为机试题 HJ94记票统计

华为机试题 HJ94记票统计

记票统计(HJ94)

华为机试HJ102:字符统计

华为机试HJ102:字符统计

华为机试HJ40:统计字符