九度OJ 1007:奥运排序问题 (排序)
2015-10-14 22:34
411 查看
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:7344
解决:1568
题目描述:
按要求,给国家进行排名。
输入:
有多组数据。
第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。
第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。
接下来一行给出M个国家号。
输出:
排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例
对每个国家给出最佳排名排名方式 和 最终排名
格式为: 排名:排名方式
如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例
如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4.
每组数据后加一个空行。
样例输入:
样例输出:
来源:2010年浙江大学计算机及软件工程研究生机试真题
思路:
排序题,对基本能力考察的比较多,结构体、变量定义、数组、排序等等。
对于这种排序题,一定要对qsort或者sort非常熟,才能提高做题效率。
本题中我用了指针数组,写法上更加精炼一些,可供参考。
代码:
内存限制:32 兆
特殊判题:否
提交:7344
解决:1568
题目描述:
按要求,给国家进行排名。
输入:
有多组数据。
第一行给出国家数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年浙江大学计算机及软件工程研究生机试真题
思路:
排序题,对基本能力考察的比较多,结构体、变量定义、数组、排序等等。
对于这种排序题,一定要对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 ; int num ; 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 ****************************************************************/
相关文章推荐
- ubuntu 14.04 里面没有语言支持(language support)
- Linux 命令 - ping: 向网络主机发送 ICMP ECHO_REQUEST 包
- 九度OJ 1007:奥运排序问题 (排序)
- 关于蒲公英
- java判断一个字符串是否为空的方法总结
- linux shell数据重定向(输入重定向与输出重定向)详细分析
- 我亲爱的老师们(*^__^*)
- MVC框架 - 高级示例
- 【tarjan】BZOJ 1051:受欢迎的牛
- 学习心得(Java语言)
- 关于servlet中出现GET方法不能应用于此url的解决办法
- PostgreSQL range gist index 20x+ speedup than Mysql index combine query
- simple introduction for bash
- PostgreSQL index scan enlarge heap page scans when index and column correlation small
- Android开发:shape和selector和layer-list的(详细说明)
- PS学习笔记之初识分辨率
- 分享一个简单程序(webApi+castle+Automapper+Ef+angular)
- iOS最新上线流程+续费 2015-7-20更新
- .NET学习笔记(一)————认识.NET平台与C#
- 视频处理三帧差分法简易代码