• 数据结构与算法题目集(中文)7-40 奥运排行榜 (25分) (使用sort函数排序)


    1.题目

    每年奥运会各大媒体都会公布一个排行榜,但是细心的读者发现,不同国家的排行榜略有不同。比如中国金牌总数列第一的时候,中国媒体就公布“金牌榜”;而美国的奖牌总数第一,于是美国媒体就公布“奖牌榜”。如果人口少的国家公布一个“国民人均奖牌榜”,说不定非洲的国家会成为榜魁…… 现在就请你写一个程序,对每个前来咨询的国家按照对其最有利的方式计算它的排名。

    输入格式:

    输入的第一行给出两个正整数N和M(≤224,因为世界上共有224个国家和地区),分别是参与排名的国家和地区的总个数、以及前来咨询的国家的个数。为简单起见,我们把国家从0 ~ N−1编号。之后有N行输入,第i行给出编号为i−1的国家的金牌数、奖牌数、国民人口数(单位为百万),数字均为[0,1000]区间内的整数,用空格分隔。最后面一行给出M个前来咨询的国家的编号,用空格分隔。

    输出格式:

    在一行里顺序输出前来咨询的国家的排名:计算方式编号。其排名按照对该国家最有利的方式计算;计算方式编号为:金牌榜=1,奖牌榜=2,国民人均金牌榜=3,国民人均奖牌榜=4。输出间以空格分隔,输出结尾不能有多余空格。

    若某国在不同排名方式下有相同名次,则输出编号最小的计算方式。

    输入样例:

    4 4
    51 100 1000
    36 110 300
    6 14 32
    5 18 40
    0 1 2 3
    

    输出样例:

    1:1 1:2 1:3 1:4

    2.题目分析

     注意:当数量出现相同的时候,排名也要并列!!

    3.代码

    /*
    注意数量相同的时候,排名也要一样!!!!
    */
    #include<iostream>
    #include<algorithm>
    #include<functional>
    #include<cmath>
    using namespace std;
    struct node
    {
    	int number;//编号
    	int	gold;//金牌数
    	int medal;//奖牌数
    	double averagegold;//国民人均金牌数
    	double averagemedal;//国民人均奖牌数
    	int goldnum;//金牌排名
    	int medalnum;//奖牌排名
    	int averagegoldnum;//国民人均金牌排名
    	int averagemedalnum;//国民人均奖排名
    	int smallest;//排名最小值
    	int smallesttype;//最小值类型
    }list[250];
    bool cmpgold(node &a, node &b)
    {
    		return a.gold > b.gold;
    }
    bool cmpmedal(node &a, node &b)
    {
    	return a.medal > b.medal;
    }
    bool cmpaveragegold(node &a, node &b)
    {
    		return a.averagegold > b.averagegold;
    }
    bool cmpaveragemedal(node &a, node &b)
    {
    	return a.averagemedal > b.averagemedal;
    }
    bool cmpnumber(node &a, node &b)
    {
    	return a.number < b.number;
    }
    
    int main()
    {
    	int n, m;
    	cin >> n >> m;
    	for (int i = 0; i < n; i++)
    	{
    		int a, b, c;
    		cin >> a >> b >> c;
    		list[i].number = i;
    		list[i].gold = a;
    		list[i].medal = b;
    		list[i].averagegold =list[i].gold*1.0/c;
    		list[i].averagemedal = list[i].medal*1.0/c;
    
    	}
    	int search[250];
    	for (int i = 0; i < m; i++)
    	{
    		cin >> search[i];
    	}
    	sort(list, list + n, cmpgold);
    	list[0].goldnum = 0;
    	for (int i = 1; i < n; i++)
    	{
    		if (list[i - 1].gold != list[i].gold)
    
    			list[i].goldnum = i;
    		else
    			list[i].goldnum = list[i-1].goldnum;//注意数量相同的时候,排名也要一样!!!!
    	}
    	sort(list, list + n, cmpmedal);
    	list[0].medalnum = 0;
    	for (int i = 1; i < n; i++)
    	{
    		if (list[i].medal != list[i-1].medal)
    			list[i].medalnum = i;
    		else
    			list[i].medalnum = list[i - 1].medalnum;
    	}
    	sort(list, list + n, cmpaveragegold);
    	list[0].averagegoldnum = 0;
    	for (int i = 1; i < n; i++)
    	{
    		if (list[i].averagegold != list[i - 1].averagegold)
    			list[i].averagegoldnum = i;
    		else
    			list[i].averagegoldnum = list[i - 1].averagegoldnum;
    	}
    	sort(list, list + n, cmpaveragemedal);
    	list[0].averagemedalnum = 0;
    	for (int i = 1; i < n; i++)
    	{
    		if (list[i].averagemedal != list[i - 1].averagemedal)
    			list[i].averagemedalnum = i;
    		else
    			list[i].averagemedalnum = list[i - 1].averagemedalnum;
    	}
        //上面是获取四种排名
    	for (int i = 0; i < n; i++)
    	{
    		int min;
    		int mini;
    		if (list[i].goldnum >list[i].medalnum)
    		{
    			min = list[i].medalnum;
    			mini = 2;
    		}
    		else
    		{
    			min = list[i].goldnum;
    			mini = 1;
    		}
    		//***************************
    		int min2;
    		int mini2;
    		if (list[i].averagegoldnum>list[i].averagemedalnum)
    		{
    			min2 = list[i].averagemedalnum;
    			mini2 = 4;
    		}
    		else
    		{
    			min2 = list[i].averagegoldnum;
    			mini2 = 3;
    		}
    		//**************************************
    		int minf;
    		int minif;
    		if (min>min2)
    		{
    			minf = min2;
    			minif =mini2 ;
    		}
    		else
    		{
    			minf = min;
    			minif = mini;
    		}
    
    		list[i].smallest = minf;
    		list[i].smallesttype = minif;
    	}
        //上面是获得最小值以及类型
    	int count = 0;
    	sort(list, list + n, cmpnumber);//按照编号
    	for (int i = 0; i < m; i++)
    	{
    		if (count == 0)
    		{
    			cout << list[search[i]].smallest+1 << ":" << list[search[i]].smallesttype;
    			count++;
    		}
    		else
    		{
    			cout <<" "<< list[search[i]].smallest+1 << ":" << list[search[i]].smallesttype;
    
    		}
    		
    	}
    
    
    }
  • 相关阅读:
    SpringBoot自定义错误页面,SpringBoot 404、500错误提示页面
    SpringBoot切换Tomcat容器,SpringBoot使用Jetty容器
    SpringBoot 国际化配置,SpringBoot Locale 国际化
    SpringBoot Logback配置,SpringBoot日志配置
    SpringBoot thymeleaf使用方法,thymeleaf模板迭代
    SpringBoot thymeleaf模板页面没提示,SpringBoot thymeleaf模板插件安装
    JSP判断闰年
    JSP求和计算
    JSP指令
    jsp新建项目
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12788998.html
Copyright © 2020-2023  润新知