#include <iostream>
#include <stdlib.h>
#include <algorithm>
using namespace std;
typedef struct record{
int gold;
int prize;
// double goldr;
// double prizer;
int num;
int id;
int rank[5];
}record;
bool compid(const record& a,const record &b)
{
return a.id<b.id;
}
bool comp1(const record& a,const record &b)
{
return a.gold>b.gold;
}
bool comp2(const record& a,const record &b)
{
return a.prize>b.prize;
}
bool comp3(const record& a,const record &b)
{
return a.gold*b.num>b.gold*a.num;
}
bool comp4(const record& a,const record &b)
{
return a.prize*b.num>b.prize*a.num;
}
void func()
{
int n,m;
while(cin>>n>>m)
{
record re[n];
for(int i=0;i<n;i++)
{
int gold,prize,num;
cin>>gold>>prize>>num;
re[i].gold=gold;
re[i].prize=prize;
// re[i].goldr=(double)gold/num;
// re[i].prizer=(double)prize/num;
re[i].num=num;
}
record r[m];
for(int i=0;i<m;i++)
{
int t;
cin>>t;
r[i]=re[t];
r[i].id=i;
}
int way=1;
sort(r,r+m,comp1);
for(int i=0;i<m;i++)
{
r[i].rank[way]=i+1;
if(i!=0)
if(r[i].gold==r[i-1].gold)
r[i].rank[way]=r[i-1].rank[way];
/*
if(i==0)
r[i].rank[way]=1;
else if(r[i].gold==r[i-1].gold)
r[i].rank[way]=r[i-1].rank[way];
else
r[i].rank[way]=r[i-1].rank[way]+1;
*/
}
way++;
sort(r,r+m,comp2);
for(int i=0;i<m;i++)
{
r[i].rank[way]=i+1;
if(i!=0)
if(r[i].prize==r[i-1].prize)
r[i].rank[way]=r[i-1].rank[way];
}
way++;
sort(r,r+m,comp3);
for(int i=0;i<m;i++)
{
r[i].rank[way]=i+1;
if(i!=0)
if(r[i].gold*r[i-1].num==r[i-1].gold*r[i].num)
r[i].rank[way]=r[i-1].rank[way];
}
way++;
sort(r,r+m,comp4);
for(int i=0;i<m;i++)
{
r[i].rank[way]=i+1;
if(i!=0)
if(r[i].prize*r[i-1].num==r[i-1].prize*r[i].num)
r[i].rank[way]=r[i-1].rank[way];
}
sort(r,r+m,compid);
int min;
int minway;
for(int i=0;i<m;i++)
{
for(int j=1;j<=4;j++)
{
if(j==1){
min=r[i].rank[j];
minway=j;
}
else{
if(min>r[i].rank[j]){
min=r[i].rank[j];
minway=j;
}
}
}
cout<<min<<":"<<minway<<endl;
}
cout<<endl;
}
}
int main(int argc, char *argv[])
{
//printf("Hello, world\n");
func();
return 0;
}
每种排名方式都算一次
相同排名时,名次数不增加
注意:
相同数目排序名次如何变化;除法的相等比较,利用 通分改为乘法
-
题目描述:
-
按要求,给国家进行排名。
-
输入:
-
有多组数据。
第一行给出国家数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