A
/* 思路:模拟 分析: 1 题目要求的在游戏结束后最大的点的值的玩家,或者具有相同点值的情况下最早出现 */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> using namespace std; #define MAXN 1010 #define N 50 int n , pos; int vis[MAXN]; int p[MAXN]; char input[MAXN][N]; char name[MAXN][N]; map<string , int>mp; int main(){ int max , cnt; while(scanf("%d%*c" , &n) != EOF){ /*第一次输入*/ for(int i = 0 ; i < n ; i++) scanf("%s %d%*c" , input[i] , &p[i]); /*第一次模拟*/ max = 0 , pos = 0; for(int i = 0 ; i < n ; i++){ int flag = -1; for(int j = 0 ; j < pos ; j++){ if(!strcmp(name[j] , input[i])){ flag = j; break; } } if(flag == -1) strcpy(name[pos++] , input[i]); mp[input[i]] += p[i]; } memset(vis , 0 , sizeof(vis)); for(int i = 0 ; i < pos ; i++) max = max < mp[name[i]] ? mp[name[i]] : max; for(int i = 0 ; i < pos ; i++){ if(max == mp[name[i]]) vis[i] = 1; } /*第二次模拟*/ mp.clear(); for(int i = 0 ; i < n ; i++){ mp[input[i]] += p[i]; int tmp = 0; for(int i = 0 ; i < pos ; i++){ if(tmp < mp[name[i]]){ tmp = mp[name[i]]; cnt = i; } } if(tmp >= max && vis[cnt]) break; } printf("%s\n" , name[cnt]); } return 0; }
时间: 2024-09-23 03:24:19