九度OJ 1007:奥运排序问题 (排序)
- 题目描述:
-
按要求,给国家进行排名。
- 输入:
-
有多组数据。
第一行给出国家数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
思路:
排序题,对基本能力考察的比较多,结构体、变量定义、数组、排序等等。
对于这种排序题,一定要对qsort或者sort非常熟,才能提高做题效率。
本题中我用了指针数组,写法上更加精炼一些,可供参考。
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define N 1000 struct record { int country; double data[4]; int rank[4]; }; typedef int (*PTRFUN)(const void *, const void *); int n, m; struct record rec[N]; int num[N]; PTRFUN pf[4]; int cmp0(const void *b, const void *a) { return (((struct record *)a)->data[0] > ((struct record *)b)->data[0]) ? 1 : -1; } int cmp1(const void *b, const void *a) { return (((struct record *)a)->data[1] > ((struct record *)b)->data[1]) ? 1 : -1; } int cmp2(const void *b, const void *a) { return (((struct record *)a)->data[2] > ((struct record *)b)->data[2]) ? 1 : -1; } int cmp3(const void *b, const void *a) { return (((struct record *)a)->data[3] > ((struct record *)b)->data[3]) ? 1 : -1; } int cmp4(const void *a, const void *b) { return ((struct record *)a)->country - ((struct record *)b)->country; } int main(void) { int i, j, k; pf[0] = cmp0; pf[1] = cmp1; pf[2] = cmp2; pf[3] = cmp3; while (scanf("%d", &n) != EOF && n) { scanf("%d", &m); for (i=0; i<n; i++) { rec[i].country = N; int people; scanf("%lf%lf%d", &rec[i].data[0], &rec[i].data[1], &people); rec[i].data[2] = rec[i].data[0]/people; rec[i].data[3] = rec[i].data[1]/people; } for (i=0; i<m; i++) { scanf("%d", &num[i]); rec[num[i]].country = i; } qsort(rec, n, sizeof(rec[0]), cmp4); for (i=0; i<4; i++) { qsort(rec, m, sizeof(rec[0]), *pf[i]); k = 0; for (j=0; j<m; j++) { //printf("country=%d, data[i]=%d\n", rec[j].country, rec[j].data[i]); if (j == 0) k++; else if (rec[j].data[i] != rec[j-1].data[i]) k = j+1; rec[j].rank[i] = k; } } qsort(rec, m, sizeof(rec[0]), cmp4); for (i=0; i<m; i++) { struct record *r = &rec[i]; k = 0; //printf("rec[%d]->rank[0]=%d\n", num[i], r->rank[0]); for (j=1; j<4; j++) { //printf("rec[%d]->rank[%d]=%d\n", num[i], j, r->rank[j]); if(r->rank[j] < r->rank[k]) k = j; } printf("%d:%d\n", r->rank[k], k+1); } printf("\n"); } return 0; } /************************************************************** Problem: 1007 User: liangrx06 Language: C Result: Accepted Time:0 ms Memory:972 kb ****************************************************************/
编程算法爱好者。