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 }
有些目标看似很遥远,但只要付出足够多的努力,这一切总有可能实现!