分析
开结构体分别记录:名字,语文成绩,语文排名,数学成绩,数学排名,能否都进前50%,最终权重。
分别排序记录名次,模拟一下,注意细节。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
struct node
{
string name;
ll ch,rkch,ma,rkma,p;
int rkt;
ll final;
}a[100001];
int n;
ll cmp1(node l,node r){return l.ch>r.ch;}
ll cmp2(node l,node r){return l.ma>r.ma;}
ll cmp3(node l,node r)
{
if(l.final==r.final) return l.p<r.p;
else return l.final<r.final;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].name;
cin>>a[i].ch>>a[i].ma;
a[i].rkt=1;
a[i].p=i;
}
sort(a+1,a+n+1,cmp1);
a[1].rkch=1;
for(int i=2;i<=n;i++)
{
if(a[i].ch==a[i-1].ch) a[i].rkch=a[i-1].rkch;
else a[i].rkch=i;
if(a[i].rkch>n/2) a[i].rkt=0;
}
sort(a+1,a+n+1,cmp2);
a[1].rkma=1;
for(int i=2;i<=n;i++)
{
if(a[i].ma==a[i-1].ma) a[i].rkma=a[i-1].rkma;
else a[i].rkma=i;
if(a[i].rkma>n/2) a[i].rkt=0;
}
for(int i=1;i<=n;i++)
{
a[i].final=a[i].rkma*a[i].rkch;
}
sort(a+1,a+n+1,cmp3);
int ff=0;
// for(int i=1;i<=n;i++)
// {
// cout<<a[i].name<<' '<<a[i].rkch<<' '<<a[i].rkma<<' '<<a[i].rkt<<' '<<a[i].final<<endl;
// }
for(int i=1;i<=n;i++)
{
if(a[i].rkt==1)
{
ff=1;
cout<<a[i].name<<endl;
}
}
if(ff==0) cout<<"none";
return 0;
}