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 }
有些目标看似很遥远,但只要付出足够多的努力,这一切总有可能实现!
原文地址:https://www.cnblogs.com/Bravewtz/p/10349629.html