-
题目描述:
-
按要求,给国家进行排名。
-
输入:
-
有多组数据。
第一行给出国家数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
尼玛呀,不要对所有国家进行排序,只要那M个国家。排序之后原序号就乱了。然后,很弱智的问题,排序后跟前一个国家比较相等后,并不是取前一个国家的最好排名,而是这次排名。写代码的时候会短路啊。看代码更短路啊!
- #include <iostream>
- #include <string>
- #include <algorithm>
- #include <memory.h>
- #include <cstdio>
- #include <cstdlib>
- using namespace std;
- int way;
- struct Node{
- int praise;
- int gold;
- int people;
- double goldrate;
- double praiserate;
- int min;
- int way;
- int th;
- };
- double getvalue(const Node & node){
- switch(way){
- case 1:return node.gold;
- case 2:return node.praise;
- case 3:return node.goldrate;
- case 4:return node.praiserate;
- case 5:return -node.th;
- }
- }
- int cmp(const Node &a, const Node &b){
- return getvalue(a)>getvalue(b);
- }
- Node nodes[100];;
- Node src[100];
- int main(){
- //freopen("in.txt", "r", stdin);
- int n, m, t;
- while(cin>>n>>m){
- for(int i=0;i<n;++i){
- scanf("%d%d%d", &src[i].gold, &src[i].praise, &src[i].people);
- src[i].goldrate = (src[i].gold+0.0)/src[i].people;
- src[i].praiserate = (src[i].praise+0.0)/src[i].people;
- }
- for(int i=0;i<m;++i){
- scanf("%d", &t);
- nodes[i] = src[t];
- nodes[i].th = i;
- }
- way = 1;
- sort(nodes, nodes+m, cmp);
- nodes[0].min = 1;
- nodes[0].way = 1;
- for(int i=1;i<n;++i){
- if(getvalue(nodes[i])==getvalue(nodes[i-1]))
- nodes[i].min = nodes[i-1].min;
- else
- nodes[i].min = i+1;
- nodes[i].way = 1;
- }
- for(way=2;way<=4;++way){
- sort(nodes, nodes+m, cmp);
- if(nodes[0].min!=1){
- nodes[0].min = 1;
- nodes[0].way = way;
- }
- int pre = 1;
- for(int i=1;i<n;++i){
- int th;
- if(getvalue(nodes[i])==getvalue(nodes[i-1])){
- th = pre;//跟之前的国家的这次排名相等,not nodes[i].min
- }else{
- th = i+1;
- pre = th;
- }
- if(th<nodes[i].min){
- nodes[i].min = th;
- nodes[i].way = way;
- }
- }
- }
- way = 5;
- sort(nodes, nodes+m, cmp);
- for(int i=0;i<m;++i){
- printf("%d:%d\n", nodes[i].min, nodes[i].way);
- }
- printf("\n");
- }
- //fclose(stdin);
- }