首页 > ACM题库 > 九度OJ > 九度-1007-奥运排序问题[解题代码]
2013
12-12

九度-1007-奥运排序问题[解题代码]

题目来源:2010年浙江大学计算机及软件工程研究生机试真题

题目描述:

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

输入:
有多组数据。
第一行给出国家数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


cpp 代码如下:
#include <stdio.h>
#include <stdlib.h>
int * gold, * total, * people;
int n, m; int * conIndexs;
int main() {
	while (scanf("%d %d", &n, &m) != EOF) {
		gold = (int *) malloc(n * 4);
		total = (int *) malloc(n * 4);
		people = (int *) malloc(n * 4);
		conIndexs = (int *) malloc(m * 4);
		int i;
		for (i = 0; i < n; i++)  scanf("%d %d %d", &gold[i], &total[i], &people[i]);
		for (i = 0; i < m; i++) scanf("%d", &conIndexs[i]);
		for (i = 0; i < m; i++) {
			int lasttype = 1;int lastcnt = n;int type;
			for (type = 1; type <= 4; type++) {
				int cnt = 1;int j;
				for (j = 0; j < m; j++) {
					if (i != j) {
						if (type == 1) {
							if (gold[conIndexs[i]] < gold[conIndexs[j]])
								cnt++;
						} else if (type == 2) {
							if (total[conIndexs[i]] < total[conIndexs[j]])
								cnt++;
						} else if (type == 3) {
							if (gold[conIndexs[i]] * people[conIndexs[j]]
									< gold[conIndexs[j]] * people[conIndexs[i]])
								cnt++;
						} else {
							if (total[conIndexs[i]] * people[conIndexs[j]]
									< total[conIndexs[j]]
											* people[conIndexs[i]])
								cnt++;
						}
					}
				}
				if (lastcnt > cnt) {
					lastcnt = cnt;
					lasttype = type;
				}
			}
			printf("%d:%d\n", lastcnt, lasttype);
		}
		printf("\n");
	}
	return 0;
}




/**************************************************************
	Problem: 1007
	User: coder
	Language: C
	Result: Accepted
	Time:0 ms
	Memory:912 kb
****************************************************************/