九度OJ 1007:奥运排序问题 (排序)
2024-09-24 07:35:56
时间限制: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
思路:
排序题,对基本能力考察的比较多,结构体、变量定义、数组、排序等等。
对于这种排序题,一定要对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
****************************************************************/
最新文章
- 项目vue2.0仿外卖APP(五)
- ASM:《X86汇编语言-从实模式到保护模式》第11章:进入保护模式
- 【翻译】VSM 和触发器
- 116. Populating Next Right Pointers in Each Node
- Mybatis 中常用的java类型与jdbc类型
- iOS 开发查看应用的沙盒文件
- laravel5验证码
- 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅵ
- 正确决解Hibernate4.*中:Connection cannot be null when &#39;hibernate.dialect&#39; not set
- XML和对象属性互转的基类
- JDBC连接SQL Server 2005步骤详解
- HTML第二课
- 【转】NAS 黑群晖 配置完成(不含硬盘),NAS能做什么?
- 纯js星级评分
- js之DOM对象一
- Mysql TIMESTAMPDIFF测试
- Log4j Threshold属性指定输出等级
- Java Web(二) Servlet详解
- FreeMarker:Java模板引擎
- 【javascript】javascript常用函数大全
热门文章
- Codeforces Round #467 (Div. 2) B. Vile Grasshoppers[求去掉2-y中所有2-p的数的倍数后剩下的最大值]
- Codeforces 535B Tavas and SaDDas 水题一枚
- Tiny4412 支持 adb reboot-bootloader
- PROFILE - 库存:物料状态支持 控制【物料状态定义】禁止的事务处理
- mac 配置sencha touch环境
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总【转】
- 算法之美--1.蒙特卡洛方法计算pi
- JAVA基础针对自己薄弱环节总结01(循环之前的知识)
- An internal error occurred Exception caught during execution of commit command
- JAVA_Could not find property [struts.actionMapping]怎么办