九度oj 题目1007:奥运排序问题   恢复

题目描述:

按要求,给国家进行排名。

输入:                       
有多组数据。 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。 接下来一行给出M个国家号。
输出:                       
排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名 格式为: 排名:排名方式 如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例 如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4. 每组数据后加一个空行。
样例输入:                       
  1. 4 4
  2. 4 8 1
  3. 6 6 2
  4. 4 8 2
  5. 2 12 4
  6. 0 1 2 3
  7. 4 2
  8. 8 10 1
  9. 8 11 2
  10. 8 12 3
  11. 8 13 4
  12. 0 3
样例输出:                       
  1. 1:3
  2. 1:1
  3. 2:1
  4. 1:2
  5.  
  6. 1:1
  7. 1:1 这道题不难,但我也提交了N次才通过,悲哀 原先的代码是这样
  1. 1 #include <cstdio>
  2. 2 #include <cstdlib>
  3. 3 #include <cstring>
  4. 4 #include <string>
  5. 5 #include <algorithm>
  6. 6 #define MAX 1000
  7. 7 #define BASIC 1
  8. 8 struct country{
  9. 9 int goldNum;
  10. 10 int medalNum;
  11. 11 int population;
  12. 12 double goldRatio;
  13. 13 double medalRatio;
  14. 14 int placeGold;
  15. 15 int placeMedal;
  16. 16 int placeGR;
  17. 17 int placeMR;
  18. 18 int num;
  19. 19 };
  20. 20 country old[MAX];
  21. 21 country cal[MAX];
  22. 22
  23. 23 int compareGOLD(const void* a, const void *b) {
  24. 24 return (*(country*)b).goldNum - (*(country*)a).goldNum;
  25. 25 }
  26. 26
  27. 27 int compareMEDAL(const void* a, const void *b) {
  28. 28 return (*(country*)b).medalNum - (*(country*)a).medalNum;
  29. 29 }
  30. 30 int comparegoldRatio(const void* a, const void *b) {
  31. 31 return (*(country*)b).goldRatio - (*(country*)a).goldRatio;
  32. 32 }
  33. 33 int comparemedalRatio(const void* a, const void *b) {
  34. 34 return (*(country*)b).medalRatio - (*(country*)a).medalRatio;
  35. 35 }
  36. 36
  37. 37 int compareNum(const void* a, const void *b) {
  38. 38 return (*(country*)a).num - (*(country*)b).num;
  39. 39 }
  40. 40
  41. 41 int main(int argc, char const *argv[])
  42. 42 {
  43. 43 int N,M;
  44. 44 //freopen("input.txt","r",stdin);
  45. 45 while(scanf("%d %d",&N,&M) != EOF) {
  46. 46 for(int i = 0; i < N; i++) {
  47. 47 scanf("%d %d %d",&old[i].goldNum,&old[i].medalNum,&old[i].population);
  48. 48 }
  49. 49 for(int i = 0; i < M; i++) {
  50. 50 int toCal;
  51. 51 scanf("%d",&toCal);
  52. 52 cal[i] = old[toCal];
  53. 53 cal[i].goldRatio = (double)cal[i].goldNum/(double)cal[i].population;
  54. 54 cal[i].medalRatio = (double)cal[i].medalRatio/(double)cal[i].population;
  55. 55 cal[i].placeGold = cal[i].placeMedal = cal[i].placeGR = cal[i].placeMR = -1;
  56. 56 cal[i].num = i;
  57. 57 }
  58. 58 qsort(cal,M,sizeof(country),compareGOLD);
  59. 59 int place = 1;
  60. 60 cal[0].placeGold = 1;
  61. 61 for(int i = 1; i < M; i++) {
  62. 62 if(cal[i].goldNum != cal[i-1].goldNum) {
  63. 63 place++;
  64. 64 }
  65. 65 cal[i].placeGold = place;
  66. 66 }
  67. 67
  68. 68
  69. 69
  70. 70 qsort(cal,M,sizeof(country),compareMEDAL);
  71. 71 place = 1;
  72. 72 cal[0].placeMedal = 1;
  73. 73 for(int i = 1; i < M; i++) {
  74. 74 if(cal[i].medalNum != cal[i-1].medalNum) {
  75. 75 place++;
  76. 76 }
  77. 77 cal[i].placeMedal = place;
  78. 78 }
  79. 79
  80. 80 qsort(cal,M,sizeof(country),comparegoldRatio);
  81. 81 place = 1;
  82. 82 cal[0].placeGR = 1;
  83. 83 for(int i = 1; i < M; i++) {
  84. 84 if(cal[i].goldRatio != cal[i-1].goldRatio) {
  85. 85 place++;
  86. 86 }
  87. 87 cal[i].placeGR = place;
  88. 88 }
  89. 89
  90. 90 qsort(cal,M,sizeof(country),comparemedalRatio);
  91. 91 place = 1;
  92. 92 cal[0].placeMR = 1;
  93. 93 for(int i = 1; i < M; i++) {
  94. 94 if(cal[i].placeMR != cal[i-1].placeMR) {
  95. 95 place++;
  96. 96 }
  97. 97 cal[i].placeMR = place;
  98. 98 }
  99. 99
  100. 100 qsort(cal,M,sizeof(country),compareNum);
  101. 101 for(int i = 0; i < M; i++) {
  102. 102 int min = cal[i].placeGold;
  103. 103 int way = BASIC;
  104. 104 if(cal[i].placeMedal < min) {
  105. 105 min = cal[i].placeMedal;
  106. 106 way = BASIC + 1;
  107. 107 }
  108. 108 if(cal[i].placeGR< min) {
  109. 109 min = cal[i].placeGR;
  110. 110 way = BASIC + 2;
  111. 111 }
  112. 112 if(cal[i].placeMR< min) {
  113. 113 min = cal[i].placeMR;
  114. 114 way = BASIC + 3;
  115. 115 }
  116. 116 printf("%d:%d\n",min,way);
  117. 117 }
  118. 118 printf("\n");
  119. 119
  120. 120 /*for(int i = 0; i < M; i++) {
  121. 121
  122. 122 printf("%d %d %d\n",cal[i].num,cal[i].goldNum,cal[i].placeGold);
  123. 123 }
  124. 124 printf("\n");*/
  125. 125 }
  126. 126 return 0;
  127. 127 }

这段代码犯了两个错误,一是54行粗心的把medalRatio算错,二是计算排名时算错,按照题目要求,如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4. 而我的程序写出来则是1,2,2,3 改正后的代码如下:

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <string>
  5. #include <algorithm>
  6. #define MAX 1005
  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 = ; i < N; i++) {
  47. scanf("%d %d %d",&old[i].goldNum,&old[i].medalNum,&old[i].population);
  48. }
  49. for(int i = ; 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].medalNum/(double)cal[i].population;
  55. cal[i].placeGold = cal[i].placeMedal = cal[i].placeGR = cal[i].placeMR = MAX;
  56. cal[i].num = i;
  57. }
  58. qsort(cal,M,sizeof(country),compareGOLD);
  59.  
  60. int place = ;
  61. cal[].placeGold = ;
  62. for(int i = ; i < M; i++) {
  63. if(cal[i].goldNum != cal[i-].goldNum) {
  64. place = i+;
  65. }
  66.  
  67. cal[i].placeGold = place;
  68. }
  69.  
  70. /*for(int i = 0; i < M; i++) {
  71.  
  72. printf("%d %d %d\n",cal[i].num,cal[i].goldNum,cal[i].placeGold);
  73. }
  74. printf("\n");*/
  75.  
  76. qsort(cal,M,sizeof(country),compareMEDAL);
  77. place = ;
  78. cal[].placeMedal = ;
  79. for(int i = ; i < M; i++) {
  80. if(cal[i].medalNum != cal[i-].medalNum) {
  81. place = i+;
  82. }
  83.  
  84. cal[i].placeMedal = place;
  85. }
  86.  
  87. qsort(cal,M,sizeof(country),comparegoldRatio);
  88. place = ;
  89. cal[].placeGR = ;
  90. for(int i = ; i < M; i++) {
  91. if(cal[i].goldRatio != cal[i-].goldRatio) {
  92. place = i+;
  93. }
  94.  
  95. cal[i].placeGR = place;
  96. }
  97.  
  98. qsort(cal,M,sizeof(country),comparemedalRatio);
  99. place = ;
  100. cal[].placeMR = ;
  101. for(int i = ; i < M; i++) {
  102. if(cal[i].placeMR != cal[i-].placeMR) {
  103. place = i+;
  104. }
  105.  
  106. cal[i].placeMR = place;
  107. }
  108.  
  109. qsort(cal,M,sizeof(country),compareNum);
  110. for(int i = ; i < M; i++) {
  111. int min = cal[i].placeGold;
  112. int way = BASIC;
  113. if(cal[i].placeMedal < min) {
  114. min = cal[i].placeMedal;
  115. way = BASIC + ;
  116. }
  117. if(cal[i].placeGR< min) {
  118. min = cal[i].placeGR;
  119. way = BASIC + ;
  120. }
  121. if(cal[i].placeMR< min) {
  122. min = cal[i].placeMR;
  123. way = BASIC + ;
  124. }
  125. printf("%d:%d\n",min,way);
  126. }
  127. printf("\n");
  128.  
  129. /*printf("M is %d\n",M);
  130. for(int i = 0; i < M; i++) {
  131.  
  132. printf("%d %d %d\n",cal[i].num,cal[i].goldNum,cal[i].placeGold);
  133. }
  134. printf("\n");*/
  135. }
  136. return ;
  137. }

多么痛的领悟!

九度oj 题目1007:奥运排序问题的更多相关文章

  1. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  2. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  4. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  5. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  6. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  7. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

  8. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

  9. 九度oj 题目1024:畅通工程

    题目描述:     省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道 ...

随机推荐

  1. 火狐浏览器不支持location.reload()(以改变页面大小时重新刷新页面为例)

    背景:当页面大小改变时需要重新刷新页面,以适应相应的尺寸 解决方法: var url = window.location.href; var parm = parseInt(Math.random() ...

  2. 人脸识别 python调用face++ 功能测试

    使用python调用face++的API,调用detect功能,识别人脸 首先进入face++官网注册,获得API Key和API Secret.使用官网提供的免费python api调用功能,提供了 ...

  3. mangoDB笔记

    1.  查询 db.表.find().pretty() find(querry,project) pretty()格式化显示 findOne()  返回一条结果 比较 db.Decl_In.find( ...

  4. ES6中const的用法

    const声明一个只读的常量.一旦声明,常量的值就不能改变.且const一旦声明变量,就必须立即初始化,不能留到以后赋值. const的作用域与let命令相同:只在声明所在的块级作用域内有效. con ...

  5. 完整的.h宏定义

    ##封装中的要点 __declspec(dllexport) 表明函数为导出函数 * `extern "C"` 导出的函数名与声明一致,否则导出函数名无法正常使用 当然,也可以通过 ...

  6. TCP/IP协议头部结构体

    TCP/IP协议头部结构体(转) 网络协议结构体定义 // i386 is little_endian. #ifndef LITTLE_ENDIAN #define LITTLE_ENDIAN (1) ...

  7. 从屏幕截取一块区域,将其赋给imageView

    UIGraphicsBeginImageContext(self.bounds.size); [self.layerrenderInContext:UIGraphicsGetCurrentContex ...

  8. iOS跳转到各种系统设置界面

    定位服务 定位服务有很多APP都有,如果用户关闭了定位,那么,我们在APP里面可以提示用户打开定位服务.点击到设置界面设置,直接跳到定位服务设置界面.代码如下: //定位服务设置界面 NSURL *u ...

  9. js cookie 操作

    <html> <head> <meta charset="utf-8"> <title>Javascript cookie</ ...

  10. 【Python学习之五】高级特性1(切片、迭代、列表生成器、生成器、迭代器)

    1.切片 有一个list—>L = [1,2,3,4,5,6,7]或tuple—>T = (1,2,3,4,5,6,7),如果想取得前三个元素,怎么操作? 硬方法,也是低效的方法是:L= ...