题目链接:https://pintia.cn/problem-sets/1101307589335527424/problems/1101314114867245056

题意:给n个国家,以及每个国家的金牌数、奖牌数、人口数(百万)。以及m个来询问的国家,现在有4中排名方式(金牌数,奖牌数、人均金牌数、人均奖牌数),对来询问的每个国家给出对其最有利的排名方式以及排名。

思路:用4次sort就行,打表存进b数组,对每次询问输出相应的结果即可,注意一个坑点,比如两个国家金牌数相等,则在金牌数排行榜中这两个国家排名相同,在这wa

了一发。详见代码:(代码看着很长,其实都是重复的部分,可以写进一个循环的,懒得改了)

 #include<bits/stdc++.h>
using namespace std; struct node{
int gd,md,ps,id;
double p3,p4;
}a[]; bool cmp1(node x,node y){
return x.gd>y.gd;
} bool cmp2(node x,node y){
return x.md>y.md;
} bool cmp3(node x,node y){
return x.p3>y.p3;
} bool cmp4(node x,node y){
return x.p4>y.p4;
} int n,m,b[][]; int main(){
scanf("%d%d",&n,&m);
for(int i=;i<n;++i){
scanf("%d%d%d",&a[i].gd,&a[i].md,&a[i].ps);
a[i].id=i;
a[i].p3=a[i].gd*1.0/(a[i].ps*1.0);
a[i].p4=a[i].md*1.0/(a[i].ps*1.0);
}
sort(a,a+n,cmp1);
b[a[].id][]=;
for(int i=;i<n;++i)
if(a[i].gd==a[i-].gd)
b[a[i].id][]=b[a[i-].id][];
else
b[a[i].id][]=i+; sort(a,a+n,cmp2);
b[a[].id][]=;
for(int i=;i<n;++i)
if(a[i].md==a[i-].md)
b[a[i].id][]=b[a[i-].id][];
else
b[a[i].id][]=i+; sort(a,a+n,cmp3);
b[a[].id][]=;
for(int i=;i<n;++i)
if(a[i].p3==a[i-].p3)
b[a[i].id][]=b[a[i-].id][];
else
b[a[i].id][]=i+; sort(a,a+n,cmp4);
b[a[].id][]=;
for(int i=;i<n;++i)
if(a[i].p4==a[i-].p4)
b[a[i].id][]=b[a[i-].id][];
else
b[a[i].id][]=i+; while(m--){
int tmp;
scanf("%d",&tmp);
int t1,t2=;
for(int i=;i<=;++i)
if(t2>b[tmp][i])
t2=b[tmp][i],t1=i;
printf("%d:%d",t2,t1);
if(m) printf(" ");
}
printf("\n");
return ;
}
05-11 22:45