九度oj 题目1007:奥运排序问题 【ZJU2010考研机试题3】【容易理解混乱】

题目1007:奥运排序问题

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:5084

解决:1080

题目描述:

按要求,给国家进行排名。

输入:
有多组数据。
第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。
第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。
接下来一行给出M个国家号。
输出:
排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 
对每个国家给出最佳排名排名方式 和 最终排名
格式为: 排名:排名方式
如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例 
如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4.
每组数据后加一个空行。
样例输入:
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
样例输出:
1:3
1:1
2:1
1:2

1:1
1:1

来源:
2010年浙江大学计算机及软件工程研究生机试真题
答疑:
解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7731-1-1.html 


核心:搜索+对二维数组的处理。

本题要点:

1、是对m个需要输出国家排序,而不是所有国家排序。
2、题干表意不明:“ 对每个国家给出最佳排名排名方式 和 最终排名”应该说成:对每个国家按照最佳排名排名方式给出 最终排名;“如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例 ”,是说若按四种排名方式有排名相同的,按照这个从小到大这样的优先级排比如一个国家四种方式排名分别为(2,2,1,1)则取第三种方式1,而不是第四种。

#include <stdio.h>
#include<algorithm>
using namespace std;
const int MAX=1000,INF=10000;
int id[MAX],ansT[MAX][4],ans[MAX],style[MAX];
struct E{
	int gold;	//金牌数
	int medal;	//奖牌数
	int popu;	//人口数
	double goldRatio;   //金牌人口比例
	double medalRatio; //奖牌人口比例
}a[MAX],tmp[MAX]; // a[]--保存所有国家的输入信息; tmp[]--保存需要排序的国家信息
int main()
{
	int n,m,i,j,cnt;
    //freopen("G:\\in.txt", "r", stdin);
    while(scanf("%d%d",&n,&m)!=EOF){
		for(i=0;i<n;i++){
			scanf("%d%d%d",&a[i].gold,&a[i].medal,&a[i].popu);
			a[i].goldRatio=(double)a[i].gold/a[i].popu;  //先转换成double型再运算
			a[i].medalRatio=(double)a[i].medal/a[i].popu;
		}
		for(i=0;i<m;i++){
			scanf("%d",&id[i]);   //输入需要排序的下标,国家做下标 从0-->n-1
		}
		for(i=0;i<m;i++){
			tmp[i]=a[id[i]];
		}
//--------------下面进行查找-------------
		for(i=0;i<m;i++){ //依次查找第0个,第1个...第m-1个 需要排序的国家
			cnt=1;
			for(j=0;j<m;j++){
				if(tmp[j].gold>a[id[i]].gold)
					cnt++;
			}
			ansT[i][0]=cnt;
		}
		for(i=0;i<m;i++){ //依次查找第0个,第1个...第m-1个 需要排序的国家
			cnt=1;
			for(j=0;j<m;j++){
				if(tmp[j].medal>a[id[i]].medal)
					cnt++;
			}
			ansT[i][1]=cnt;
		}
		for(i=0;i<m;i++){ //依次查找第0个,第1个...第m-1个 需要排序的国家
			cnt=1;
			for(j=0;j<m;j++){
				if(tmp[j].goldRatio>a[id[i]].goldRatio)
					cnt++;
			}
			ansT[i][2]=cnt;
		}
		for(i=0;i<m;i++){ //依次查找第0个,第1个...第m-1个 需要排序的国家
			cnt=1;
			for(j=0;j<m;j++){
				if(tmp[j].medalRatio>a[id[i]].medalRatio)
					cnt++;
			}
			ansT[i][3]=cnt;
		}
		for(i=0;i<m;i++){
			int tmp=INF;
			for(j=0;j<4;j++){
				if(ansT[i][j]<tmp){
					tmp=ansT[i][j];
					style[i]=j+1;
					ans[i]=tmp;

				}
			}

		}
		for(i=0;i<m;i++)
			printf("%d:%d\n",ans[i],style[i]);
		printf("\n");
	}
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值