九度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 这道题不难,但我也提交了N次才通过,悲哀 原先的代码是这样1 #include <cstdio>
2 #include <cstdlib>
3 #include <cstring>
4 #include <string>
5 #include <algorithm>
6 #define MAX 1000
7 #define BASIC 1
8 struct country{
9 int goldNum;
10 int medalNum;
11 int population;
12 double goldRatio;
13 double medalRatio;
14 int placeGold;
15 int placeMedal;
16 int placeGR;
17 int placeMR;
18 int num;
19 };
20 country old[MAX];
21 country cal[MAX];
22
23 int compareGOLD(const void* a, const void *b) {
24 return (*(country*)b).goldNum - (*(country*)a).goldNum;
25 }
26
27 int compareMEDAL(const void* a, const void *b) {
28 return (*(country*)b).medalNum - (*(country*)a).medalNum;
29 }
30 int comparegoldRatio(const void* a, const void *b) {
31 return (*(country*)b).goldRatio - (*(country*)a).goldRatio;
32 }
33 int comparemedalRatio(const void* a, const void *b) {
34 return (*(country*)b).medalRatio - (*(country*)a).medalRatio;
35 }
36
37 int compareNum(const void* a, const void *b) {
38 return (*(country*)a).num - (*(country*)b).num;
39 }
40
41 int main(int argc, char const *argv[])
42 {
43 int N,M;
44 //freopen("input.txt","r",stdin);
45 while(scanf("%d %d",&N,&M) != EOF) {
46 for(int i = 0; i < N; i++) {
47 scanf("%d %d %d",&old[i].goldNum,&old[i].medalNum,&old[i].population);
48 }
49 for(int i = 0; i < M; i++) {
50 int toCal;
51 scanf("%d",&toCal);
52 cal[i] = old[toCal];
53 cal[i].goldRatio = (double)cal[i].goldNum/(double)cal[i].population;
54 cal[i].medalRatio = (double)cal[i].medalRatio/(double)cal[i].population;
55 cal[i].placeGold = cal[i].placeMedal = cal[i].placeGR = cal[i].placeMR = -1;
56 cal[i].num = i;
57 }
58 qsort(cal,M,sizeof(country),compareGOLD);
59 int place = 1;
60 cal[0].placeGold = 1;
61 for(int i = 1; i < M; i++) {
62 if(cal[i].goldNum != cal[i-1].goldNum) {
63 place++;
64 }
65 cal[i].placeGold = place;
66 }
67
68
69
70 qsort(cal,M,sizeof(country),compareMEDAL);
71 place = 1;
72 cal[0].placeMedal = 1;
73 for(int i = 1; i < M; i++) {
74 if(cal[i].medalNum != cal[i-1].medalNum) {
75 place++;
76 }
77 cal[i].placeMedal = place;
78 }
79
80 qsort(cal,M,sizeof(country),comparegoldRatio);
81 place = 1;
82 cal[0].placeGR = 1;
83 for(int i = 1; i < M; i++) {
84 if(cal[i].goldRatio != cal[i-1].goldRatio) {
85 place++;
86 }
87 cal[i].placeGR = place;
88 }
89
90 qsort(cal,M,sizeof(country),comparemedalRatio);
91 place = 1;
92 cal[0].placeMR = 1;
93 for(int i = 1; i < M; i++) {
94 if(cal[i].placeMR != cal[i-1].placeMR) {
95 place++;
96 }
97 cal[i].placeMR = place;
98 }
99
100 qsort(cal,M,sizeof(country),compareNum);
101 for(int i = 0; i < M; i++) {
102 int min = cal[i].placeGold;
103 int way = BASIC;
104 if(cal[i].placeMedal < min) {
105 min = cal[i].placeMedal;
106 way = BASIC + 1;
107 }
108 if(cal[i].placeGR< min) {
109 min = cal[i].placeGR;
110 way = BASIC + 2;
111 }
112 if(cal[i].placeMR< min) {
113 min = cal[i].placeMR;
114 way = BASIC + 3;
115 }
116 printf("%d:%d\n",min,way);
117 }
118 printf("\n");
119
120 /*for(int i = 0; i < M; i++) {
121
122 printf("%d %d %d\n",cal[i].num,cal[i].goldNum,cal[i].placeGold);
123 }
124 printf("\n");*/
125 }
126 return 0;
127 }这段代码犯了两个错误,一是54行粗心的把medalRatio算错,二是计算排名时算错,按照题目要求,如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4. 而我的程序写出来则是1,2,2,3 改正后的代码如下:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#define MAX 1005
#define BASIC 1
struct country{
int goldNum;
int medalNum;
int population;
double goldRatio;
double medalRatio;
int placeGold;
int placeMedal;
int placeGR;
int placeMR;
int num;
};
country old[MAX];
country cal[MAX]; int compareGOLD(const void* a, const void *b) {
return (*(country*)b).goldNum - (*(country*)a).goldNum;
} int compareMEDAL(const void* a, const void *b) {
return (*(country*)b).medalNum - (*(country*)a).medalNum;
}
int comparegoldRatio(const void* a, const void *b) {
return (*(country*)b).goldRatio - (*(country*)a).goldRatio;
}
int comparemedalRatio(const void* a, const void *b) {
return (*(country*)b).medalRatio - (*(country*)a).medalRatio;
} int compareNum(const void* a, const void *b) {
return (*(country*)a).num - (*(country*)b).num;
} int main(int argc, char const *argv[])
{
int N,M;
//freopen("input.txt","r",stdin);
while(scanf("%d %d",&N,&M) != EOF) {
for(int i = ; i < N; i++) {
scanf("%d %d %d",&old[i].goldNum,&old[i].medalNum,&old[i].population);
}
for(int i = ; i < M; i++) {
int toCal;
scanf("%d",&toCal);
cal[i] = old[toCal];
cal[i].goldRatio = (double)cal[i].goldNum/(double)cal[i].population;
cal[i].medalRatio = (double)cal[i].medalNum/(double)cal[i].population;
cal[i].placeGold = cal[i].placeMedal = cal[i].placeGR = cal[i].placeMR = MAX;
cal[i].num = i;
}
qsort(cal,M,sizeof(country),compareGOLD); int place = ;
cal[].placeGold = ;
for(int i = ; i < M; i++) {
if(cal[i].goldNum != cal[i-].goldNum) {
place = i+;
} cal[i].placeGold = place;
} /*for(int i = 0; i < M; i++) { printf("%d %d %d\n",cal[i].num,cal[i].goldNum,cal[i].placeGold);
}
printf("\n");*/ qsort(cal,M,sizeof(country),compareMEDAL);
place = ;
cal[].placeMedal = ;
for(int i = ; i < M; i++) {
if(cal[i].medalNum != cal[i-].medalNum) {
place = i+;
} cal[i].placeMedal = place;
} qsort(cal,M,sizeof(country),comparegoldRatio);
place = ;
cal[].placeGR = ;
for(int i = ; i < M; i++) {
if(cal[i].goldRatio != cal[i-].goldRatio) {
place = i+;
} cal[i].placeGR = place;
} qsort(cal,M,sizeof(country),comparemedalRatio);
place = ;
cal[].placeMR = ;
for(int i = ; i < M; i++) {
if(cal[i].placeMR != cal[i-].placeMR) {
place = i+;
} cal[i].placeMR = place;
} qsort(cal,M,sizeof(country),compareNum);
for(int i = ; i < M; i++) {
int min = cal[i].placeGold;
int way = BASIC;
if(cal[i].placeMedal < min) {
min = cal[i].placeMedal;
way = BASIC + ;
}
if(cal[i].placeGR< min) {
min = cal[i].placeGR;
way = BASIC + ;
}
if(cal[i].placeMR< min) {
min = cal[i].placeMR;
way = BASIC + ;
}
printf("%d:%d\n",min,way);
}
printf("\n"); /*printf("M is %d\n",M);
for(int i = 0; i < M; i++) { printf("%d %d %d\n",cal[i].num,cal[i].goldNum,cal[i].placeGold);
}
printf("\n");*/
}
return ;
}多么痛的领悟!
九度oj 题目1007:奥运排序问题的更多相关文章
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
- 九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
- 九度OJ题目1003:A+B
while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...
- 九度oj 题目1024:畅通工程
题目描述: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道 ...
随机推荐
- python+selenium之数据库连接
首先要安装Python和MySQL的连接工具 下载地址如下: https://pypi.python.org/pypi/PyMySQL https://github.com/PyMySQL/PyMyS ...
- HDU 2639 Bone Collector II (01背包,第k解)
题意: 数据是常规的01背包,但是求的不是最大容量限制下的最佳解,而是第k佳解. 思路: 有两种解法: 1)网上普遍用的O(V*K*N). 2)先用常规01背包的方法求出背包容量限制下能装的最大价值m ...
- asp页面无法访问,可尝试开始SQL Server等服务
存在问题 asp页面的英文提示,翻译后为: "一个错误发生在服务器在处理URL.请联系系统管理员(管理人).如果您是系统管理员,请点击这里了解更多关于这个错误." 解决方案 请 ...
- Spark集锦
1 Spark官网 http://spark.apache.org/ 2 Spark书籍 http://down.51cto.com/tag-spark%E4%B9%A6%E7%B1%8D.html
- CPP-STL:vector中的size和capacity
在vector中与size()和capacity() 相对应的有两个函数: resize(size_type)和reserve(size_type). Size指目前容器中实际有多少元素,对应的res ...
- NOIP模拟赛 无线通讯网
[题目描述] 国防部计划用无线网络连接若干个边防哨所.2种不同的通讯技术用来搭建无线网络:每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...
- [vijos]P1514 天才的记忆
背景 神仙飞啊飞 描述 从前有个人名叫W and N and B,他有着天才般的记忆力,他珍藏了许多许多的宝藏.在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以 ...
- css3属性:美化表单、点击元素产生的背景与边框怎么去掉,滚动回弹效果
- DeepFaceLab小白入门(3):软件使用!
换脸程序执行步骤,大部分程序都是类似.DeepFaceLab 虽然没有可视化界面,但是将整个过程分成了8个步骤,每个步骤只需点击BAT文件即可执行.只要看着序号,一个个点过去就可以了,这样的操作应该不 ...
- 【jquery】 form ajaxSubmit 问题
常见问题 这个插件跟哪些版本的jQuery兼容? 这个插件需要jQuery v1.0.3 或 以后的版本. 这个插件需要其它插件的支持吗? 不需要. 这个插件的运行效率高吗? 是的!请到 对比页面 查 ...