题意:给定n轮游戏,每轮游戏都有1个人的名字和增加或者减少的分数。比赛结束后,如果一个人的负数为负数,那么他就被淘汰了。我们求出最大分数的人的名字,如果这个最大分数有多个,我们就求出这些最大分数中最先达到>=这个最大分数的人的名字。
分析:用(STL map)模拟,我们不用管最后分数为负的人,第一轮先统计出每轮游戏结束后每个人的分数,用map统计,同时用(vector)存储操作序列,再在第二轮求出首先达到超过最大分数并且最后分数等于最大分数的人。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
struct Node
{
string s;
int p;
};
int main()
{
int n;
cin >> n;
map<string, int> mp;
map<string, int> u;
vector<Node> v;
string s;
int p;
for (int i = 1; i <= n; ++i)
{
cin >> s >> p;
v.push_back({ s, p });
mp[s] += p;
}
string res;
int mxp = -INF;
for (auto item : mp)
{
mxp = max(mxp, item.second);
}
map<string, int> mp2;
for (int i = 0; i < v.size(); ++i)
{
string name = v[i].s;
int p = v[i].p;
mp2[name] += p;
if (mp2[name] >= mxp && mp[name] == mxp)
{
res = name;
break;
}
}
cout << res << endl;
return 0;
}