奥运排序问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2948 Accepted Submission(s): 665
Problem Description
按要求,给国家进行排名。
Input
有多组数据。
第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。
第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。
接下来一行给出M个国家号。
第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。
第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。
接下来一行给出M个国家号。
Output
排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例
对每个国家给出最佳排名排名方式 和 最终排名
格式为: 排名:排名方式
如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例
如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,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
提醒:排序名次是以给出的m个国家来定的,不是n个国家一起排序。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define INF 0x3f3f3f
#define min(a,b)(a<b?a:b)
using namespace std;
struct record
{
int jin;
int jiang;
int man;
double jinman;
double jiangman;
}num[1010];
struct input//记录所有进行排序的城市 的数据
{
int jin;
int jiang;
int man;
double jinman;
double jiangman;
}in[1010];
struct node//记录排序前各个国家的数据
{
int jin;
int jiang;
int man;
double jinman;
double jiangman;
}mark[1010];
bool cmp1(input a,input b)
{
return a.jin>b.jin;
}
bool cmp2(input a,input b)
{
return a.jiang>b.jiang;
}
bool cmp3(input a,input b)
{
return a.jinman>b.jinman;
}
bool cmp4(input a,input b)
{
return a.jiangman>b.jiangman;
}
int main()
{
int country;
int i,j,n,m;
int p1,p2,p3,p4;//记录各个国家用1,2,3,4方式排名后的名次
int p;//最优名次
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d%d%d",&num[i].jin,&num[i].jiang,&num[i].man);
num[i].jinman=num[i].jin/(double)num[i].man;
num[i].jiangman=num[i].jiang/(double)num[i].man;
}
for(j=0;j<m;j++)
{
scanf("%d",&country);
in[j].jin=num[country].jin;
in[j].jiang=num[country].jiang;
in[j].jinman=num[country].jinman;
in[j].jiangman=num[country].jiangman;
mark[j].jin=num[country].jin;//记录当前国家的数据 排序后第一次出现就是该国家的名次
mark[j].jiang=num[country].jiang;
mark[j].jinman=num[country].jinman;
mark[j].jiangman=num[country].jiangman;
}
for(j=0;j<m;j++)
{
p1=p2=p3=p4=INF;
sort(in,in+m,cmp1);
for(i=0;i<m;i++)
{
if(in[i].jin==mark[j].jin)
{
p1=i;
break;
}
}
sort(in,in+m,cmp2);
for(i=0;i<m;i++)
{
if(in[i].jiang==mark[j].jiang)//第一次出现
{
p2=i;
break;
}
}
if(p2==p1)//排序方式小的优先
p2=INF;
sort(in,in+m,cmp3);
for(i=0;i<m;i++)
{
if(in[i].jinman==mark[j].jinman)
{
p3=i;
break;
}
}
if(p3==p2||p3==p1)
p3=INF;
sort(in,in+m,cmp4);
for(i=0;i<m;i++)
{
if(in[i].jiangman==mark[j].jiangman)
{
p4=i;
break;
}
}
if(p4==p3||p4==p2||p4==p1)
p4=INF;
p=min(min(p1,p2),min(p3,p4));
if(p==p1)
printf("%d:1\n",p1+1);
else if(p==p2)
printf("%d:2\n",p2+1);
else if(p==p3)
printf("%d:3\n",p3+1);
else
printf("%d:4\n",p4+1);
}
printf("\n");
}
return 0;
}