题目1007:奥运排序问题(结构体排序)

问题来源

  http://ac.jobdu.com/problem.php?pid=1007

问题描述

  每个国家根据金牌总数、奖牌总数、金牌人口比例、奖牌人口比例会有四种排序,找到最佳排名。

问题分析

  我们用结构体把每个国家的信息存下来,在进行处理。根据四种不同的排序方式计算得出四种排名。
  注意:记得最后再把国家按照最大是的顺序排回来(事先用id属性记下序号)。
  有关于sort函数使用详解请参考:http://www.cnblogs.com/AlvinZH/p/6784862.html

参考代码

//
// Created by AlvinZH on 2017/4/29.
// Copyright (c) AlvinZH. All rights reserved.
//
#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;

typedef struct Country{
    int id;
    int gold;
    int sum;
    int pop;

    double gp;//金牌人口比例
    double sp;//奖牌人口比例

    int R[5];

    Country(int a,int b,int c)
    {
        gold=a;sum=b;pop=c;
        gp=(double)a/c;
        sp=(double)b/c;
    }
}Country;

vector<Country> ALL;
vector<Country> C;

bool cmp1(Country a,Country b)
{
    return a.gold>b.gold;
}
bool cmp2(Country a,Country b)
{
    return a.sum>b.sum;
}
bool cmp3(Country a,Country b)
{
    return a.gp>b.gp;
}
bool cmp4(Country a,Country b)
{
    return a.sp>b.sp;
}
bool cmp5(Country a,Country b)
{
    return a.id<b.id;
}

int main()
{
    int n,m;
    while(~scanf("%d %d",&n,&m))
    {
        ALL.clear();
        C.clear();
        int a,b,c;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            ALL.push_back(Country(a,b,c));
        }
        for(int i=0;i<m;i++)
        {
            scanf("%d",&a);
            C.push_back(ALL[a]);
            C[i].id=i;
        }

        sort(C.begin(),C.end(),cmp1);
        for(int i=0;i<n;i++)
        {
            int rank=i;
            while(rank>0&&C[i].gold==C[rank-1].gold)
                rank--;

            C[i].R[1]=rank+1;
        }
        sort(C.begin(),C.end(),cmp2);
        for(int i=0;i<n;i++)
        {
            int rank=i;
            while(rank>0&&C[i].sum==C[rank-1].sum)
                rank--;

            C[i].R[2]=rank+1;
        }
        sort(C.begin(),C.end(),cmp3);
        for(int i=0;i<n;i++)
        {
            int rank=i;
            while(rank>0&&C[i].gp==C[rank-1].gp)
                rank--;

            C[i].R[3]=rank+1;
        }
        sort(C.begin(),C.end(),cmp4);
        for(int i=0;i<n;i++)
        {
            int rank=i;
            while(rank>0&&C[i].sp==C[rank-1].sp)
                rank--;

            C[i].R[4]=rank+1;
        }
        sort(C.begin(),C.end(),cmp5);
        for(int k=0;k<m;k++)
        {
            int choice=1;
            int rank=C[k].R[1];
            for(int i=1;i<=4;i++)
            {
                if(C[k].R[i]<rank)
                {
                    choice=i;
                    rank=C[k].R[i];
                }
            }
            printf("%d:%d
",rank,choice);
        }
        printf("
");
    }
}

作者: AlvinZH

出处: http://www.cnblogs.com/AlvinZH/

本人Github:https://github.com/Pacsiy/JobDu

本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

原文地址:https://www.cnblogs.com/AlvinZH/p/6784616.html