奥运排序问题

题目描述:

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

输入:
有多组数据。
第一行给出国家数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 }

 

posted @ 2012-05-31 09:47  cseriscser  阅读(299)  评论(0编辑  收藏  举报