【杭电oj】3789 - 奥运排序问题(排名,坑题)

奥运排序问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3211    Accepted Submission(s): 756


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

Input
有多组数据。
第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。
第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。
接下来一行给出M个国家号。
 

Output
排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 
对每个国家给出最佳排名排名方式 和 最终排名
格式为: 排名:排名方式
如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例 
如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4.
每组数据后加一个空行。
 

Sample Input
   
   
   
   
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
 

Sample Output
   
   
   
   
1:3 1:1 2:1 1:2 1:1 1:1
 

Source
浙大计算机研究生复试上机考试-2010年


啊好坑了,折腾了将近一个小时。题意是从选出的那几个国家中排序,不是全部排序!!!!!

我觉得这道题不需要sort快排,有多少人比它大,它的名次就往后退多少就行啦。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
	float g1,g2,rate1,rate2;		//double过不去,又一个坑! 
	int rg1,rg2,rg3,rg4;		//4种排序的排名 
}data[1000];
int main()
{
	int n,m;
	int rate[1000];		//需要排名的国家 
	while (~scanf ("%d %d",&n,&m))
	{
		memset (data,0,sizeof (data));
		for (int i = 0 ; i < n ; i++)
		{
			float t;
			scanf ("%f %f %f",&data[i].g1,&data[i].g2,&t);
			data[i].rate1 = data[i].g1 / t;
			data[i].rate2 = data[i].g2 / t;
			data[i].rg1 = data[i].rg2 = data[i].rg3 = data[i].rg4 = 1;
		}
		for (int i = 0 ; i < m ; i++)
			scanf ("%d",&rate[i]);
		for (int i = 0 ; i < m ; i++)
		{
			for (int j = 0 ; j < m ; j++)		//啊啊啊啊坑坑坑死了,原来是在选中的那群国家中排序,WA了10次 
			{
				if (data[rate[i]].g1 < data[rate[j]].g1)
					data[i].rg1++;
				if (data[rate[i]].g2 < data[rate[j]].g2)
					data[i].rg2++;
				if (data[rate[i]].rate1 < data[rate[j]].rate1)
					data[i].rg3++;
				if (data[rate[i]].rate2 < data[rate[j]].rate2)
					data[i].rg4++;
			}
			if (data[i].rg1 <= data[i].rg2 && data[i].rg1 <= data[i].rg3 && data[i].rg1 <= data[i].rg4)
				printf ("%d:1\n",data[i].rg1);
			else if (data[i].rg2 <= data[i].rg1 && data[i].rg2 <= data[i].rg3 && data[i].rg2 <= data[i].rg4)
				printf ("%d:2\n",data[i].rg2);
			else if (data[i].rg3 <= data[i].rg1 && data[i].rg3 <= data[i].rg2 && data[i].rg3 <= data[i].rg4)
				printf ("%d:3\n",data[i].rg3);
			else
				printf ("%d:4\n",data[i].rg4);
		}
		printf ("\n");
	}
	return 0;
}


你可能感兴趣的:(【杭电oj】3789 - 奥运排序问题(排名,坑题))