时间限制:1 秒

内存限制: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[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
****************************************************************/

九度OJ 1007:奥运排序问题 (排序)的更多相关文章

  1. 九度OJ 1349 数字在排序数组中出现的次数 -- 二分查找

    题目地址:http://ac.jobdu.com/problem.php?pid=1349 题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数 ...

  2. 九度OJ 1196:成绩排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4339 解决:1476 题目描述: 用一维数组存储学号和成绩,然后,按成绩排序输出. 输入: 输入第一行包括一个整数N(1<=N< ...

  3. 九度OJ 1185:特殊排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:15588 解决:3592 题目描述: 输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序. 输入: 输入第一行包括1个整数N,1< ...

  4. 九度OJ 1066:字符串排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5632 解决:2299 题目描述: 输入一个长度不超过20的字符串,对所输入的字符串,按照ASCII码的大小从小到大进行排序,请输出排序后的 ...

  5. 九度OJ 1061:成绩排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:17158 解决:4798 题目描述: 有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相 ...

  6. 九度OJ 1023:EXCEL排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:14605 解决:3307 题目描述:     Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能.     对每个测试用例 ...

  7. 九度OJ 1135:字符串排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1559 解决:807 题目描述: 先输入你要输入的字符串的个数.然后换行输入该组字符串.每个字符串以回车结束,每个字符串少于一百个字符. 如 ...

  8. 九度OJ 1130:日志排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1265 解决:303 题目描述: 有一个网络日志,记录了网络中计算任务的执行情况,每个计算任务对应一条如下形式的日志记录: "hs ...

  9. 九度oj 题目1202:排序

    题目1202:排序 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:28802 解决:9408 题目描述: 对输入的n个数进行排序并输出. 输入: 输入的第一行包括一个整数n(1<=n ...

随机推荐

  1. PyTorch 实现kmax-pooling

    max-pooling有很多种实现方式 (1)kmax-pooling import torch def kmax_pooling(x, dim, k): index = x.topk(k, dim= ...

  2. 【spring boot logback】日志logback格式解析

    日志logback格式解析 logback官网 格式解析 https://logback.qos.ch/manual/layouts.html#ClassicPatternLayout 官网格式解析有 ...

  3. [置顶] zabbix告警信息-lykchat信息发送系统

    lykchat信息发送系统 lykchat信息发送系统是Python3开发的,通过模拟微信网页端,基于个人微信号,为系统管理人员提供信息发送工具. 实现的功能有用户登录管理.微信登陆管理和微信信息发送 ...

  4. Vbs脚本经典教材

    转载:http://www.cnblogs.com/BeyondTechnology/archive/2011/01/10/1932440.html Vbs脚本经典教材(最全的资料还是MSDN) —为 ...

  5. 自主研发异步通信框架Minma(支持长连接和短连接)

    Minma是英文Minma Is Not Mina的简称 该框架采用Java NIO的核心技术,实现了基于事件驱动的多线程异步通信框架,支持常见的长连接(腾讯QQ)和短连接(http通信) 对于开发人 ...

  6. F - 概率(经典问题)

    Description Sometimes some mathematical results are hard to believe. One of the common problems is t ...

  7. Android开发之WebView具体解释

    概述: 一个显示网页的视图.这个类是你能够滚动自己的Web浏览器或在你的Activity中简单地显示一些在线内容的基础.它使用了WebKit渲染引擎来显示网页,包含向前和向后导航的方法(通过历史记录) ...

  8. 如何让DIV居中

    总结:text-align:center;对三中浏览器而言,都具有文字/行内元素的嵌套式居中,或者说继承式的居中,只要外面的容器设置了这个属性,那么他内部的所有元素都具有这个属性(意思是,虽然这个属性 ...

  9. css:选择器

    http://blog.csdn.net/xyz121323693/article/details/8516297 交集选择器 并集选择器 后代选择器 子代选择器 http://www.cnblogs ...

  10. linux 安装jdk和tomcat

    安装jdk 下载相关jdk .rpm包,如:jdk-8u31-linux-i586.rpm 解压:#rpm -ivh jdk-8u31-linux-i586.rpm 配置环境变量:#vi  /etc/ ...