7-17 奥运排行榜 (25 分)
Posted sykline
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7-17 奥运排行榜 (25 分)相关的知识,希望对你有一定的参考价值。
题目:
思路:针对四种排序方法构建四个结构体,按四种排序排完之后,把结果汇总到代表国家的一个结构体中。然后就是查询就是了。排序规则可通过下面的例子了解一下:
序列:g[0] = 1,g[1] = 2,g[2] = 2, g[3] = 3;
排名:1 ,2 ,2 ,3(并不是1,2,3,4)
代码:
1 #include <bits/stdc++.h> 2 #define FRE() freopen("in.txt","r",stdin) 3 using namespace std; 4 const int maxn = 500; 5 typedef unsigned long long ll; 6 int n,q; 7 8 struct Country 9 { 10 int g,s; 11 int g_p,s_p; 12 } ct[maxn]; 13 14 struct node 15 { 16 double gold_p, silver_p; 17 int g, s; 18 int id; 19 } g[maxn],s[maxn],g_p[maxn],s_p[maxn]; 20 21 void init() 22 { 23 cin>>n>>q; 24 for(int i = 0; i<n; i++) 25 { 26 int num; 27 cin>>g[i].g>>s[i].s>>num; 28 g_p[i].gold_p = 1.0*g[i].g/num; 29 s_p[i].silver_p = 1.0*s[i].s/num; 30 g[i].id = s[i].id = g_p[i].id = s_p[i].id = i; 31 } 32 return; 33 } 34 35 bool cmdg(node& a, node& b) 36 { 37 if(a.g == b.g) 38 return a.id<b.id; 39 return a.g > b.g; 40 } 41 bool cmds(node& a,node& b) 42 { 43 if(a.s==b.s) 44 return a.id<b.id; 45 return a.s > b.s; 46 } 47 bool cmdg_p(node& a,node& b) 48 { 49 return a.gold_p > b.gold_p; 50 } 51 bool cmds_p(node& a,node& b) 52 { 53 return a.silver_p > b.silver_p; 54 } 55 56 int main() 57 { 58 init(); 59 sort(g,g+n,cmdg); 60 int lastid = 0; 61 ct[g[0].id].g = 0; 62 for(int i = 1; i<n; i++) 63 { 64 if(g[i].g==g[i-1].g) 65 ct[g[i].id].g = lastid; 66 else 67 { 68 ct[g[i].id].g = i; 69 lastid = i; 70 } 71 } 72 sort(s,s+n,cmds); 73 lastid = 0; 74 ct[s[0].s].s = 0; 75 for(int i = 1; i<n; i++) 76 { 77 if(s[i].s==s[i-1].s) 78 ct[s[i].id].s = lastid; 79 else 80 { 81 ct[s[i].id].s = i; 82 lastid = i; 83 } 84 } 85 sort(g_p,g_p+n,cmdg_p); 86 lastid = 0; 87 ct[g_p[0].id].g_p = 0; 88 for(int i = 1; i<n; i++) 89 { 90 if(g_p[i].gold_p == g_p[i-1].gold_p) 91 ct[g_p[i].id].g_p = lastid; 92 else 93 { 94 ct[g_p[i].id].g_p = i; 95 lastid = i; 96 } 97 } 98 sort(s_p,s_p+n,cmds_p); 99 lastid = 0; 100 ct[s_p[0].id].s_p = 0; 101 for(int i = 1; i<n; i++) 102 { 103 if(s_p[i].silver_p == s_p[i-1].silver_p) 104 ct[s_p[i].id].s_p = lastid; 105 else 106 { 107 ct[s_p[i].id].s_p = i; 108 lastid = i; 109 } 110 } 111 for(int i = 0; i<q; i++) 112 { 113 int tmp,f,ans; 114 cin>>tmp; 115 f = 1,ans = ct[tmp].g; 116 if(ct[tmp].s<ans) 117 f = 2,ans = ct[tmp].s; 118 if(ct[tmp].g_p<ans) 119 f = 3,ans = ct[tmp].g_p; 120 if(ct[tmp].s_p<ans) 121 f = 4,ans = ct[tmp].s_p; 122 if(i) 123 cout<<" "; 124 cout<<ans+1<<":"<<f; 125 } 126 return 0; 127 } 128 /* 129 样例输入: 130 4 4 131 51 100 1000 132 36 110 300 133 6 14 32 134 5 18 40 135 0 1 2 3 136 样例输出: 137 1:1 1:2 1:3 1:4 138 */
以上是关于7-17 奥运排行榜 (25 分)的主要内容,如果未能解决你的问题,请参考以下文章