题目1007:奥运排序问题(自定义排序问题)

题目链接:http://ac.jobdu.com/problem.php?pid=1007

详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus

参考代码:

//
//  1007 奥运排序问题.cpp
//  Jobdu
//
//  Created by PengFei_Zheng on 28/04/2017.
//  Copyright © 2017 PengFei_Zheng. All rights reserved.
//

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>
//#include <cstring>
#define MAX_SIZE 1010
#define RANK 1

using namespace std;

struct Country{
    int id;
    int goldMedal;
    int totalMedal;
    int human;
    double goldRatio;
    double totalRatio;
    int rankGold;
    int rankTotal;
    int rankGoldRatio;
    int rankTotalRatio;
};

Country country[MAX_SIZE];
Country cal[MAX_SIZE];

int n, m;

int cmpRankGold(const void* a, const void *b){
    return (*(Country*)b).goldMedal - (*(Country*)a).goldMedal;
}

int cmpRankTotal(const void* a, const void *b){
    return (*(Country*)b).totalMedal - (*(Country*)a).totalMedal;
}

int cmpRankGoldRatio(const void* a, const void *b){
    return (*(Country*)b).goldRatio - (*(Country*)a).goldRatio;
}

int cmpRankTotalRatio(const void* a, const void *b){
    return (*(Country*)b).totalRatio - (*(Country*)a).totalRatio;
}

int cmpId(const void* a, const void *b){
    return (*(Country*)a).id - (*(Country*)b).id;
}

int main(){
//    freopen("/Users/pengfei_zheng/Desktop/input.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i = 0 ; i < n ; i++){
            scanf("%d%d%d",&country[i].goldMedal,&country[i].totalMedal,&country[i].human);

        }
        for(int i = 0 ; i < m ; i++){
            int tmpId;
            scanf("%d",&tmpId);
            cal[i] = country[tmpId];
            cal[i].goldRatio = (double)cal[i].goldMedal/(double)cal[i].human;
            cal[i].totalRatio = (double)cal[i].totalMedal/(double)cal[i].human;
            cal[i].id=i;
            cal[i].rankGold=cal[i].rankTotal=cal[i].rankGoldRatio=cal[i].rankTotalRatio=MAX_SIZE;
        }

        qsort(cal,m,sizeof(Country),cmpRankGold);
        int rank = 1;
        cal[0].rankGold = 1;
        for(int i = 1 ; i < m ; i++){
            if(cal[i].goldMedal!=cal[i-1].goldMedal){
                rank = i + 1;
            }
            cal[i].rankGold = rank;
        }

        qsort(cal,m,sizeof(Country),cmpRankTotal);
        rank = 1;
        cal[0].rankTotal = 1;
        for(int i = 1 ; i < m ; i++){
            if(cal[i].totalMedal!=cal[i-1].totalMedal){
                rank = i + 1;
            }
            cal[i].rankTotal = rank;
        }

        qsort(cal,m,sizeof(Country),cmpRankGoldRatio);
        rank = 1;
        cal[0].rankGoldRatio = 1;
        for(int i = 1 ; i < m ; i++){
            if(cal[i].goldRatio!=cal[i-1].goldRatio){
                rank = i + 1;
            }
            cal[i].rankGoldRatio = rank;
        }

        qsort(cal,m,sizeof(Country),cmpRankTotalRatio);
        rank = 1;
        cal[0].rankTotalRatio = 1;
        for(int i = 1 ; i < m ; i++){
            if(cal[i].totalRatio!=cal[i-1].totalRatio){
                rank = i + 1;
            }
            cal[i].rankTotalRatio = rank;
        }

        qsort(cal,m,sizeof(Country),cmpId);

        for(int i = 0 ; i < m ; i++){
//            cout<<cal[i].rankGold<<" "<<cal[i].rankTotal<<" "<<cal[i].rankGoldRatio<<" "<<cal[i].rankTotalRatio<<endl;
            int minRank = cal[i].rankGold;
            int rankChoose = RANK;
            if(cal[i].rankTotal < minRank){
                minRank = cal[i].rankTotal;
                rankChoose= RANK + 1;
            }
            if(cal[i].rankGoldRatio < minRank){
                minRank = cal[i].rankGoldRatio;
                rankChoose = RANK + 2;
            }
            if(cal[i].rankTotalRatio < minRank){
                minRank = cal[i].rankTotalRatio;
                rankChoose = RANK + 3;
            }
            printf("%d:%d\n",minRank,rankChoose);
        }
        printf("\n");
    }
    return 0;
}
/**************************************************************
    Problem: 1007
    User: zpfbuaa
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1612 kb
****************************************************************/
时间: 2024-10-21 22:19:13

题目1007:奥运排序问题(自定义排序问题)的相关文章

九度oj 题目1007:奥运排序问题

九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1. 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万). 接下来一行给出M个国家号. 输出:                        排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名 格式为: 排名:排名

题目1007:奥运排序问题

题目描述: 按要求,给国家进行排名. 输入: 有多组数据.第一行给出国家数N,要求排名的国家数M,国家号从0到N-1.第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万).接下来一行给出M个国家号. 输出: 排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名格式为: 排名:排名方式如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例 如果有并列

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

题目链接:http://ac.jobdu.com/problem.php?pid=1007 详解连接:https://github.com/Pacsiy/JobDu 参考代码: // // Created by AlvinZH on 2017/4/29. // Copyright (c) AlvinZH. All rights reserved. // #include <iostream> #include <vector> #include <cstdio> #in

shell练习--PAT题目1007:关于素数对(失败案例)

让我们定义d?n??为:d?n??=p?n+1??−p?n??,其中p?i??是第i个素数.显然有d?1??=1,且对于n>1有d?n??是偶数.“素数对猜想”认为“存在无穷多对相邻且差为2的素数”. 现给定任意正整数N(<),请计算不超过N的满足猜想的素数对的个数. 输入格式: 输入在一行给出正整数N. 输出格式: 在一行中输出不超过N的满足猜想的素数对的个数. 输入样例: 20 输出样例: 4 这个题目,我一直没弄明白,然后走了很多逻辑误区,然后用了很多for的循环来判断.基本思路: 1.

第六天上课

知识点:异常语句 try catch finally:休息语句:System.Threading.Thread.Sleep();        案例:          try//出现错误,直接跳转到catch,下面的语句不执行: { Console.Write("请输入一个整数"); Console.WriteLine("hello!"); } catch//try中有错才执行: { Console.WriteLine("输入有误"); } f

[笔记]Learning to Rank算法介绍:RankSVM 和 IR SVM

之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to Rank的几类常用的方法:pointwise,pairwise,listwise.这篇博客就很多公司在实际中通常使用的pairwise的方法进行介绍,首先我们介绍相对简单的 RankSVM 和 IR SVM. 1. RankSVM RankSVM的基本思想是,将排序问题转化为pairwise的分类问题

UVA213信息解码

<算法竞赛入门经典>第四章函数和递归中的题目,考察了自定义函数应用和二进制相关内容.(个人认为考察二进制相关知识占多). 题意:给一个编码头和一串编码(编码可以换行),编码头根据以下规则对应编码{  考虑下面的01串:  0,00,01,10,000,001,010,101,110,0000,0001.....首先是长度为1的串,然后是长度为二的串,以此类推.并且每一段长度的数字从0到(1<<n)-1(第n段)排列,即题目中所说不包括全为1的串. 编码文本由多个小节组成,每小节前三

LTR之RankSvm

两种对比: 1.深度学习CNN提特征+RankSVM 之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to Rank的几类常用的方法:pointwise,pairwise,listwise.这篇博客就很多公司在实际中通常使用的pairwise的方法进行介绍,首先我们介绍相对简单的 RankSVM 和 IR SVM. 1. RankSVM RankSVM的

Java深入学习(1):多线程详解

多线程目的:在同一时刻有多条不同路径执行程序,提高程序运行效率 多线程应用:数据库连接池,多线程文件下载等 注意:在文件下载中使用多线程,无法提高速度 在一个进程中,一定会有主线程 从基础开始,多线程的使用方式: 1.继承Thread类:(不推荐) public class ThreadDemo extends Thread { @Override public void run() { //写入线程执行的代码 } public static void main(String[] args) {