pta7-18奥运排行榜(模拟)
Posted frankchen831x
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pta7-18奥运排行榜(模拟)相关的知识,希望对你有一定的参考价值。
题目链接:https://pintia.cn/problem-sets/1101307589335527424/problems/1101314114867245056
题意:给n个国家,以及每个国家的金牌数、奖牌数、人口数(百万)。以及m个来询问的国家,现在有4中排名方式(金牌数,奖牌数、人均金牌数、人均奖牌数),对来询问的每个国家给出对其最有利的排名方式以及排名。
思路:用4次sort就行,打表存进b数组,对每次询问输出相应的结果即可,注意一个坑点,比如两个国家金牌数相等,则在金牌数排行榜中这两个国家排名相同,在这wa
了一发。详见代码:(代码看着很长,其实都是重复的部分,可以写进一个循环的,懒得改了)
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 struct node{ 5 int gd,md,ps,id; 6 double p3,p4; 7 }a[230]; 8 9 bool cmp1(node x,node y){ 10 return x.gd>y.gd; 11 } 12 13 bool cmp2(node x,node y){ 14 return x.md>y.md; 15 } 16 17 bool cmp3(node x,node y){ 18 return x.p3>y.p3; 19 } 20 21 bool cmp4(node x,node y){ 22 return x.p4>y.p4; 23 } 24 25 int n,m,b[230][5]; 26 27 int main(){ 28 scanf("%d%d",&n,&m); 29 for(int i=0;i<n;++i){ 30 scanf("%d%d%d",&a[i].gd,&a[i].md,&a[i].ps); 31 a[i].id=i; 32 a[i].p3=a[i].gd*1.0/(a[i].ps*1.0); 33 a[i].p4=a[i].md*1.0/(a[i].ps*1.0); 34 } 35 sort(a,a+n,cmp1); 36 b[a[0].id][1]=1; 37 for(int i=1;i<n;++i) 38 if(a[i].gd==a[i-1].gd) 39 b[a[i].id][1]=b[a[i-1].id][1]; 40 else 41 b[a[i].id][1]=i+1; 42 43 sort(a,a+n,cmp2); 44 b[a[0].id][2]=1; 45 for(int i=1;i<n;++i) 46 if(a[i].md==a[i-1].md) 47 b[a[i].id][2]=b[a[i-1].id][2]; 48 else 49 b[a[i].id][2]=i+1; 50 51 sort(a,a+n,cmp3); 52 b[a[0].id][3]=1; 53 for(int i=1;i<n;++i) 54 if(a[i].p3==a[i-1].p3) 55 b[a[i].id][3]=b[a[i-1].id][3]; 56 else 57 b[a[i].id][3]=i+1; 58 59 sort(a,a+n,cmp4); 60 b[a[0].id][4]=1; 61 for(int i=1;i<n;++i) 62 if(a[i].p4==a[i-1].p4) 63 b[a[i].id][4]=b[a[i-1].id][4]; 64 else 65 b[a[i].id][4]=i+1; 66 67 while(m--){ 68 int tmp; 69 scanf("%d",&tmp); 70 int t1,t2=250; 71 for(int i=1;i<=4;++i) 72 if(t2>b[tmp][i]) 73 t2=b[tmp][i],t1=i; 74 printf("%d:%d",t2,t1); 75 if(m) printf(" "); 76 } 77 printf(" "); 78 return 0; 79 }
以上是关于pta7-18奥运排行榜(模拟)的主要内容,如果未能解决你的问题,请参考以下文章
个推0代码数据可视化实操 | 基于Tableau的中国奥运数据探索