求c++大神帮忙解一下这道题

英雄投票全世界各地都有很多超级英雄,哪些英雄人物最厉害呢?有好事之徒发起了一个全民投票,每人一票,需要选出k名最受欢迎的英雄人物。输入第一行为k,代表需要选出前k名最受欢... 英雄投票
全世界各地都有很多超级英雄,哪些英雄人物最厉害呢?有好事之徒发起了一个全民投票,
每人一票,需要选出 k 名最受欢迎的英雄人物。
输入第一行为 k,代表需要选出前 k 名最受欢迎的英雄人物。第二行为所有人的投票情况,
由得票的英雄人物名字组成,姓名都为小写字母,由空格隔开。共有多少投票无法提前知
晓。k<=100。输出共 k 行英雄姓名,以得票高低排序,得票相同时按字典序排序。
输入样例:
3
monkeyking captainamerica monkeyking doraemon superman magneto wolverine
optimusprime batman superman spiderman monkeyking
输出样例:
monkeyking
superman
batman
展开
 我来答
丿艾瑞灬莉娅
2018-07-11 · TA获得超过916个赞
知道小有建树答主
回答量:926
采纳率:78%
帮助的人:427万
展开全部
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

typedef struct
{
    string name;
    int score;
}Hero;

void getVote(const string& str, vector<Hero>& res)
{
    int i = 0, j = 0;
    int len = str.size();
    while( i < len )
    {
        j = i;
        while( i<len && str[i]!=' ' )
            ++i;
        string s = str.substr(j, i-j);
        ++i;    //    指向下一个单词的首字母
        
        vector<Hero>::iterator it;
        for(it = res.begin(); it != res.end(); ++it){
            if( (*it).name == s ){
                (*it).score++;
                break;
            }
        }
        if( it == res.end() ){
            Hero t = {s,1};
            res.push_back(t);
        }
    }
}

bool cmp(const Hero& s1, const Hero& s2)
{
    if( s1.score != s2.score )
        return s1.score > s2.score;
    else
        return s1.name  < s2.name;
}
            
int main()
{
    int k;
    string vote;
    vector<Hero> res;
    
    (cin>>k).get();        //吃掉回车 
    getline(cin, vote);
    getVote(vote, res);
    
    sort(res.begin(), res.end(), cmp);
    for(int i = 0; i < k; ++i)
        cout << res[i].name << endl;
    
    return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式