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.
每组数据后加一个空行。
样例输入:
样例输出:
尼玛呀,不要对所有国家进行排序,只要那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);
}
按要求,给国家进行排名。
输入:
有多组数据。
第一行给出国家数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);
}
相关文章推荐
- http://ac.jobdu.com/problem.php?pid=1027
- http://ac.jobdu.com/problem.php?pid=1023
- http://ac.jobdu.com/problem.php?pid=1024
- http://ac.jobdu.com/problem.php?pid=1025
- http://ac.jobdu.com/problem.php?pid=1026
- http://ac.jobdu.com/problem.php?pid=1022
- http://ac.jobdu.com/problem.php?pid=1008
- http://ac.jobdu.com/problem.php?pid=1020
- http://ac.jobdu.com/problem.php?pid=1021
- http://ac.jobdu.com/problem.php?pid=1009
- http://ac.jobdu.com/problem.php?pid=1017
- 二分查找 http://ac.jobdu.com/problem.php?pid=1545
- http://ac.jobdu.com/problem.php?pid=1033
- http://ac.jobdu.com/problem.php?pid=1019
- http://ac.jobdu.com/problem.php?pid=1006
- http://ac.jobdu.com/problem.php?pid=1014
- http://ac.jobdu.com/problem.php?pid=1005
- http://ac.jobdu.com/problem.php?pid=1032
- http://ac.jobdu.com/problem.php?pid=1012
- http://ac.jobdu.com/problem.php?pid=1035