1 奥运排行榜
排行榜 奥运
2023-09-14 09:01:32 时间
1 奥运排行榜
分数 25
作者 陈越
单位 浙江大学
每年奥运会各大媒体都会公布一个排行榜,但是细心的读者发现,不同国家的排行榜略有不同。比如中国金牌总数列第一的时候,中国媒体就公布“金牌榜”;而美国的奖牌总数第一,于是美国媒体就公布“奖牌榜”。如果人口少的国家公布一个“国民人均奖牌榜”,说不定非洲的国家会成为榜魁…… 现在就请你写一个程序,对每个前来咨询的国家按照对其最有利的方式计算它的排名。
输入格式:
输入的第一行给出两个正整数N和M(≤224,因为世界上共有224个国家和地区),分别是参与排名的国家和地区的总个数、以及前来咨询的国家的个数。为简单起见,我们把国家从0 ~ N−1编号。之后有N行输入,第i行给出编号为i−1的国家的金牌数、奖牌数、国民人口数(单位为百万),数字均为[0,1000]区间内的整数,用空格分隔。最后面一行给出M个前来咨询的国家的编号,用空格分隔。
输出格式:
在一行里顺序输出前来咨询的国家的排名:计算方式编号。其排名按照对该国家最有利的方式计算;计算方式编号为:金牌榜=1,奖牌榜=2,国民人均金牌榜=3,国民人均奖牌榜=4。输出间以空格分隔,输出结尾不能有多余空格。
若某国在不同排名方式下有相同名次,则输出编号最小的计算方式。
输入样例:
4 4
51 100 1000
36 110 300
6 14 32
5 18 40
0 1 2 3
输出样例:
1:1 1:2 1:3 1:4
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
C++ (g++)
思路:
我们用结构体存放每个国家的金牌数、奖牌数、人口数、人均金牌数、人均奖牌数、每种排名方式的排名、最后要选取的方式。
根据题目写四个比较方法。
输入每个国家的金牌数、奖牌数、人口数,然后计算出人均金牌数、人均奖牌数。
然后四种方式排序,注意这里有相等的情况。
然后选择合适的排序方式。
最后按格式输入输出查询的国家及其查询结果。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef struct Nation{
int index;
int gold;
int cnt;
int people;
double avegold;
double avecnt;
int pos[5];
int final;
}Nation;
Nation na[225];
bool cmp1(Nation n1,Nation n2){
return n1.gold>n2.gold;
}
bool cmp2(Nation n1,Nation n2){
return n1.cnt>n2.cnt;
}
bool cmp3(Nation n1,Nation n2){
return n1.avegold>n2.avegold;
}
bool cmp4(Nation n1,Nation n2){
return n1.avecnt>n2.avecnt;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
na[i].index=i;
cin>>na[i].gold>>na[i].cnt>>na[i].people;
if(na[i].people){
na[i].avegold=na[i].gold*1.0/na[i].people;
na[i].avecnt=na[i].cnt*1.0/na[i].people;
}
}
sort(na,na+n,cmp1);
na[0].pos[1]=1;
for(int i=1;i<n;i++){
if(na[i].gold==na[i-1].gold){
na[i].pos[1]=na[i-1].pos[1];
}else{
na[i].pos[1]=i+1;
}
}
sort(na,na+n,cmp2);
na[0].pos[2]=1;
for(int i=1;i<n;i++){
if(na[i].cnt==na[i-1].cnt){
na[i].pos[2]=na[i-1].pos[2];
}else{
na[i].pos[2]=i+1;
}
}
sort(na,na+n,cmp3);
na[0].pos[3]=1;
for(int i=1;i<n;i++){
if(na[i].avegold==na[i-1].avegold){
na[i].pos[3]=na[i-1].pos[3];
}else{
na[i].pos[3]=i+1;
}
}
sort(na,na+n,cmp4);
na[0].pos[4]=1;
for(int i=1;i<n;i++){
if(na[i].avecnt==na[i-1].avecnt){
na[i].pos[4]=na[i-1].pos[4];
}else{
na[i].pos[4]=i+1;
}
}
for(int i=0;i<n;i++){
int final;
int minx=225;
for(int j=1;j<=4;j++){
if(na[na[i].index].pos[j]<minx){
minx=na[na[i].index].pos[j];
final=j;
}
}
na[na[i].index].final=final;
}
int index;
for(int i=0;i<m;i++){
cin>>index;
for(int j=0;j<n;j++){
if(na[j].index==index){
if(i>0)
cout<<" ";
cout<<na[j].pos[na[j].final]<<":"<<na[j].final;
break;
}
}
}
return 0;
}
相关文章
- 2022 全球科技公司薪酬排行榜出炉,看完我表示严重拖后腿了。。
- 运动排行榜日行9万步,背后原来是模拟器作弊
- 十大安全数字货币钱包排行榜_全球数字货币排行
- .Net 和Assembly下滑其它回升,TIOBE编程语言2022年12排行榜
- 使用Redis实现微信步数排行榜功能
- Linux版本排行榜:选择最佳的一款(linux版本排行)
- 2014年4月编程语言排行榜:Perl 创历史新低
- 10MySQL排行榜:前10名最佳实践(mysqltop)
- 微信用Redis记录步数排行榜(微信步数排行榜redis)
- Redis统计游戏排行榜,展示最强者(游戏排行榜redis)
- Redis面试掌握关键技巧,攀登排行榜(redis面试排行)
- 使用Redis集群轻松实现排行榜(redis集群使用排行榜)