set做法耗时和内存
常规做法耗时和内存
map存人名与数字之间的关系,利用set的upper_bound()函数找到第一个大于平均数一半(必须是浮点,否则会失精)的数,然后再找到这个数的前一个数,与平均数的一半的差值作比较。
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define N 10001
using namespace std;
int n;
map<int,string>vis;
int sum;
int main()
{
cin>>n;
int a;
string str;
set<double>s;
for(int i=0;i<n;i++)
{
cin>>str>>a;
sum+=a;
vis[a]=str;
s.insert(a);
}
double x=(1.0)*sum/(2*n);
set<double>::iterator it1=s.upper_bound(x);
set<double>::iterator it2=it1;
--it1;
if(it1==s.end())
{
cout<<(int)x<<" "<<vis[*it2]<<endl;
return 0;
}
else if(it2==s.end())
{
cout<<(int)x<<" "<<vis[*it1]<<endl;
return 0;
}
if(abs(*it1-x)>abs(*it2-x))
{
cout<<(int)x<<" "<<vis[*it2]<<endl;
}
else
{
cout<<(int)x<<" "<<vis[*it1]<<endl;
}
return 0;
}