您的位置:首页 > 理论基础 > 计算机网络

http://ac.jobdu.com/problem.php?pid=1007

2012-10-22 16:15 344 查看
题目描述:

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

输入:
有多组数据。

第一行给出国家数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个国家。排序之后原序号就乱了。然后,很弱智的问题,排序后跟前一个国家比较相等后,并不是取前一个国家的最好排名,而是这次排名。写代码的时候会短路啊。看代码更短路啊!

[cpp] view
plaincopy

#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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: