hdoj 3789 奥运排序问题

奥运排序问题

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个国家号。

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
提醒:排序名次是以给出的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;
}

你可能感兴趣的:(hdoj 3789 奥运排序问题)