按要求,给国家进行排名。
Input
有多组数据。
第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。
第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。
接下来一行给出M个国家号。
Output
排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例
对每个国家给出最佳排名排名方式 和 最终排名
格式为: 排名:排名方式
如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例
如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4.
每组数据后加一个空行。
Sample Input
4 4
4 8 1
6 6 2
4 8 2
2 12 4
0 1 2 3
4 2
8 10 1
8 11 2
8 12 3
8 13 4
0 3
Sample Output
1:3
1:1
2:1
1:2
1:1
1:1
Sponsor
本题最大的一个坑,就是题目,很容易让人产生歧义,错了好多次才对。
注意题目中:“按要求,给国家进行排名。” “第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。”
题目的真正的意思是对需要输出的M个国家里面进行排序,而不是在全部国家里面。
别看代码很长其实大部分都是重复的。
#include <stdio.h>
#include <string.h>
#include<algorithm>
using namespace std;
int a[1000],b[1000],c[1000],a11[10],a1[1000],b1[1000],c1[1000],nes[1000];
int main()
{
int n,m,j,i,k,k1,k2,k3,k4;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
}
memset(a1,0,sizeof(a1));
memset(b1,0,sizeof(b1));
memset(c1,0,sizeof(c1));
for(j=0;j<m;j++)
{
scanf("%d",&k);
nes[j]=k;
a1[k]=a[k];
b1[k]=b[k];
c1[k]=c[k];
}
for(j=0;j<m;j++)
{
k=nes[j];
k1=1;
for(i=0;i<n;i++)
{
if(a1[i]>a1[k])
{
k1++;
}
}
a11[0]=k1;
if(k1==1)
{
printf("1:1\n");
continue;
}
k2=1;
for(i=0;i<n;i++)
{
if(b1[i]>b1[k])
{
k2++;
}
}
a11[1]=k2;
if(k2==1)
{
printf("1:2\n");
continue;
}
k3=1;
for(i=0;i<n;i++)
{
if((a1[i]*1.0/c1[i])>(a1[k]*1.0/c1[k]))
{
k3++;
}
}
a11[2]=k3;
if(k3==1)
{
printf("1:3\n");
continue;
}
k4=1;
for(i=0;i<n;i++)
{
if(b1[i]*1.0/c1[i]>b1[k]*1.0/c1[k])
{
k4++;
}
}
a11[3]=k4;
if(k4==1)
{
printf("1:4\n");
continue;
}
sort(a11,a11+4);
if(a11[0]==k1)
{
printf("%d:1\n",a11[0]);
continue;
}
if(a11[0]==k2)
{
printf("%d:2\n",a11[0]);
continue;
}
if(a11[0]==k3)
{
printf("%d:3\n",a11[0]);
continue;
}
if(a11[0]==k4)
{
printf("%d:4\n",a11[0]);
continue;
}
}
printf("\n");
}
return 0;
}