奥运排序问题
- 题目描述:
-
按要求,给国家进行排名。
- 输入:
-
有多组数据。
第一行给出国家数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
1 #include <cstdlib> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <cctype> 6 7 #include <iostream> 8 #include <string> 9 #include <vector> 10 #include <list> 11 #include <deque> 12 #include <set> 13 #include <map> 14 #include <stack> 15 #include <queue> 16 #include <algorithm> 17 18 #define MAXN 100001 19 #define MAXD 99999999 20 using namespace std; 21 22 23 struct Re{ 24 int id; 25 int gn; 26 int an; 27 int rn; 28 double avgn; 29 double avan; 30 }; 31 32 vector<Re>vt1,vt2; 33 34 35 int vv[1000]; 36 37 38 bool cmp1(Re x,Re y) 39 { 40 if(x.gn>y.gn) 41 return true; 42 return false; 43 } 44 45 46 bool cmp2(Re x,Re y) 47 { 48 if(x.an>y.an) 49 return true; 50 return false; 51 } 52 53 54 bool cmp3(Re x,Re y) 55 { 56 if(x.avgn>y.avgn) 57 return true; 58 return false; 59 } 60 61 62 bool cmp4(Re x,Re y) 63 { 64 if(x.avan>y.avan) 65 return true; 66 67 return false; 68 } 69 70 71 72 73 74 int main() 75 { 76 77 int n,m; 78 79 int i,j,k; 80 81 82 while(scanf("%d%d",&n,&m)!=EOF) 83 { 84 vt1.clear(); 85 vt2.clear(); 86 87 for(i=0;i<n;i++) 88 { 89 Re ans; 90 91 scanf("%d%d%d",&ans.gn,&ans.an,&ans.rn); 92 93 ans.id=i; 94 ans.avan=ans.an*1.0/ans.rn; 95 ans.avgn=ans.gn*1.0/ans.rn; 96 97 98 99 vt1.push_back(ans); 100 } 101 102 103 104 for(i=0;i<m;i++) 105 { 106 int v; 107 108 scanf("%d",&v); 109 110 vv[i]=v; 111 112 vt2.push_back(vt1[v]); 113 } 114 115 116 for(i=0;i<m;i++) 117 { 118 int v=vv[i]; 119 120 int rk; 121 int ty; 122 123 124 sort(vt2.begin(),vt2.end(),cmp1); 125 126 for(j=0;j<vt2.size();j++) 127 { 128 if(vt2[j].id==v) 129 {break;} 130 } 131 132 for(k=j-1;k>=0;k--) 133 { 134 if(vt2[k].gn!=vt2[j].gn) 135 {break;} 136 } 137 138 139 140 141 k++; 142 rk=k; 143 ty=1; 144 145 146 147 148 sort(vt2.begin(),vt2.end(),cmp2); 149 150 for(j=0;j<vt2.size();j++) 151 { 152 if(vt2[j].id==v) 153 {break;} 154 } 155 156 for(k=j-1;k>=0;k--) 157 { 158 if(vt2[k].an!=vt2[j].an) 159 {break;} 160 } 161 162 163 k++; 164 165 if(k<rk) 166 { 167 rk=k; 168 ty=2; 169 } 170 171 172 173 174 175 176 sort(vt2.begin(),vt2.end(),cmp3); 177 178 for(j=0;j<vt2.size();j++) 179 { 180 if(vt2[j].id==v) 181 {break;} 182 } 183 184 for(k=j-1;k>=0;k--) 185 { 186 if(vt2[k].avgn!=vt2[j].avgn) 187 {break;} 188 } 189 190 191 k++; 192 193 if(k<rk) 194 { 195 rk=k; 196 ty=3; 197 } 198 199 200 201 202 203 204 sort(vt2.begin(),vt2.end(),cmp4); 205 206 for(j=0;j<vt2.size();j++) 207 { 208 if(vt2[j].id==v) 209 {break;} 210 } 211 212 for(k=j-1;k>=0;k--) 213 { 214 if(vt2[k].avan!=vt2[j].avan) 215 {break;} 216 } 217 218 219 k++; 220 221 if(k<rk) 222 { 223 rk=k; 224 ty=4; 225 } 226 227 228 229 230 231 232 cout<<rk+1<<":"<<ty<<endl; 233 234 235 236 } 237 cout<<endl; 238 } 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 return 0; 261 }