ss
题意:
n个人打牌,每次得到一个点数,问最后得到点数之和(设为max)最大的人是谁,若有拥有最大点数的人不止一个,则最先到达这个点数(>=max)的人为赢家。
思路:
使用map记录每个人最后的点数,遍历map,得到最大值key,再遍历一次map,将拥有最大点数的人存进一个vector中。然后遍历输入,判断谁先达到max这个值(>=max),即为赢家。
总结:
题意理解不清楚,思路开始时错误。
代码:
#include <iostream>
#include <cstring>
#include <string>
#include <map>
#include <utility>
#include <algorithm>
#include <vector>
using namespace std;
pair<string, int> arr[1500];
int main(){
int n, po;
string in;
cin>>n;
map<string, int> mp;
for(int i=0; i<n; ++i){
cin>>in>>po;
mp[in] += po;
arr[i].first = in;
arr[i].second = po;
}
int tmp = -0x3f3f3f3f;
for(map<string, int>::iterator it=mp.begin(); it!=mp.end(); ++it){
string name = it->first;
int cnt = it->second;
if(tmp < cnt){
tmp = cnt;
}
}
vector<string> v;
for(map<string, int>::iterator it=mp.begin(); it!=mp.end(); ++it){
string name = it->first;
int cnt = it->second;
if(tmp == cnt){
v.push_back(name);
}
}
pair<string, int> ans;
ans.first = "";
ans.second = 0x3f3f3f3f;
for(vector<string>::iterator it=v.begin(); it!=v.end(); ++it){
int pos; int tot=0;
for(int i=0; i<n; ++i){
if(arr[i].first==(*it)){
tot += arr[i].second;
if(tot>=tmp) {
pos = i;
break;
}
}
}
if(ans.second>pos){
ans.first = (*it);
ans.second = pos;
}
}
cout<<ans.first<<endl;
return 0;
}