zoukankan      html  css  js  c++  java
  • 题目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和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

  • 相关阅读:
    关于禁止浏览器的回退功能
    实时监听输入框值变化的完美方案:oninput & onpropertychange
    Sublime Text 3 快捷键精华版
    计算手动输入的文本长度
    ie的用户名密码输入框右侧提示去掉
    获取元素定位
    select option
    js打断点
    Android LaunchMode
    Gradle 使用第三方库总结
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/6784616.html
Copyright © 2011-2022 走看看