• CF2A Winner


    题目描述:

    在 Berland 流行着纸牌游戏 “Berlogging” ,这个游戏的赢家是根据以下规则确定的:在每一轮中,玩家获得或失去一定数量的分数,在游戏过程中,分数被记录在“名称和得分”行中,其中名称是玩家的名字,得分是在这一轮中获得的分数。得分是负值意味着玩家失去了相应的分数。如果在比赛结束时只有一名玩家分数最多,他就是获胜者。如果两名或两名以上的玩家在比赛结束时都有最大的分数 m,那么其中首先获得至少 m 分的玩家胜利。开始时,每个玩家都是0分。保证在比赛结束时至少有一个玩家的分数为正。

    输入格式:

    第一行包含整数n(1 <= n <= 1000),n 是游戏进行的的回合数。

    第 2 ~ n+1 行,按照时间顺序输入“名称和得分”行的信息,其中名称是长度不大于 32 的小写字母组成的字符串,分数的绝对值不大于 1000。

    输出格式:

    输出获胜者的名称。

    分析:利用map可以很快的解出这道题,在map中找value的最大值的时候,网上大部分的代码都是去遍历一遍,我在这里为了让自己更加熟练练习STL,就写了哥按照vaule排序的函数。另外,有可能会出现比赛结束后最大分相等的情况。所以我们就要结束之后再访问一遍,查找第一次大于等于最大分的情况。这也是m1出现的意义。。。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<map>
     4 #include<vector>
     5 #include<cstring>
     6 #include<cstdlib>
     7 using namespace std;
     8 #define maxn 1010
     9 int MIN=-1000;
    10 string name[maxn];
    11 int score[maxn];
    12 bool flag(pair<string,int>o1 , pair<string,int>o2){
    13     return o1.second>o2.second;
    14 }
    15 map<string,int> m,m1;/*m记录最大值,m1进行重新统计,找到第一次达到分数的人*/
    16 int main(){
    17     int n;
    18     string name_max;//记录结果人名
    19     cin>>n;
    20     for( int i=0; i<n; i++ ){
    21         cin>>name[i]>>score[i];
    22         m[name[i]]+=score[i];
    23     }
    24     vector< pair<string,int> > dic(m.begin(),m.end());
    25     sort(dic.begin(),dic.end(),flag);
    26     int temp_maxn=dic[0].second;
    27     for(int i=0; i<n; i++ ){
    28         m1[name[i]]+=score[i];//重新进行统计
    29         if(m[name[i]]==temp_maxn&&m1[name[i]]>=temp_maxn){
    30             name_max=name[i];
    31             break;
    32         }
    33     }
    34     cout<<name_max;
    35     return 0;
    36 }
    有些目标看似很遥远,但只要付出足够多的努力,这一切总有可能实现!
  • 相关阅读:
    windows安装kafka
    excel打开utf-8的csv乱码
    laravel 记录慢sql日志
    php ftp连接的坑
    公用辅助方法
    ubuntu重置网络配置
    php socket
    docker ftp配置多个用户
    php aes-ecb-128位加密
    redis集群 哨兵模式
  • 原文地址:https://www.cnblogs.com/Bravewtz/p/10349629.html
Copyright © 2020-2023  润新知