【51nod】学习委员候选人
题目
解题思路
将语文成绩和数学成绩分别排序,得到排名
然后把都在前50%的人的权重算出来
从小到大排序后输出
成绩排名是很细节了,要注意同分同排名,如果和前面不同分,那排名就是当前位置
代码
#include<bits/stdc++.h>
using namespace std;
pair <int,int> a[50010],b[50010];
int n,t,k,x[50010],y[50010],p[50010];
string s[50010];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
cin>>s[i];
scanf("%d%d",&x[i],&y[i]);
a[i]=make_pair(x[i],i);
b[i]=make_pair(y[i],i);
}
sort(a+1,a+n+1);
sort(b+1,b+n+1); //从小到大排,处理排名时倒着处理
for (int i=n;i>n/2;i--)
{
if (a[i].first!=a[i+1].first)
p[a[i].second]=k=n-i+1;
else p[a[i].second]=k;
}
int i=n/2;
while (a[i].first==a[i+1].first&&i) p[a[i].second]=k,i--; //与前50%同分的也要
k=0;
for (int i=n;i>n/2;i--) //处理数学排名时,算出权重
{
int z=b[i].second;
if (b[i].first!=b[i+1].first)
k=n-i+1;
if (p[z]>0) a[++t]=make_pair(p[z]*k,z);
}
i=n/2;
while (b[i].first==b[i+1].first&&i)
{
int z=b[i].second;
if (p[z]>0) a[++t]=make_pair(p[z]*k,z);
i--;
}
if (!t)
{
printf("none");
return 0;
}
sort(a+1,a+t+1); //排序后输出
for (int i=1;i<=t;i++)
cout<<s[a[i].second]<<endl;
return 0;
}