这道题有个天坑: 输入数据中人口可能是0。多组数据的人口是0,金牌人口比、奖牌人口比都是并列第一,比如8.3.0和6.5.0金牌人口比和奖牌人口比都是并列第一。而输入数据还有0.3.0这样式的,题目认为这种的金牌人口比是0,倒数第一。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
bool intcmp(int a,int b){
return a>b;
}
bool doublecmp(double a,double b){
return a>b;
}
int main(){
int n,m;
while(cin>>n>>m){
int data[3][n];
double div[2][n];
for(int i=0;i<n;i++){
cin>>data[0][i]; //金牌
cin>>data[1][i]; //奖牌
cin>>data[2][i]; //人口
if(data[2][i]==0){
if(data[0][i]==0)
div[0][i]=0;
else
div[0][i]=100;
if(data[1][i]==0)
div[0][i]=0;
else
div[1][i]=100;
}
else{
div[0][i]=1.0*data[0][i]/data[2][i];
div[1][i]=1.0*data[1][i]/data[2][i];
}
}
int country[m];
for(int i=0;i<m;i++)
cin>>country[i];
for(int c=0;c<m;c++){
int rank[4];
memset(rank,0,sizeof(rank));
for(int i=0;i<2;i++)
for(int j=0;j<n;j++)
if(data[i][j]>data[i][country[c]])
rank[i]+=1;
for(int i=0;i<2;i++)
for(int j=0;j<n;j++)
if(div[i][j]>div[i][country[c]])
rank[i+2]+=1;
int min=rank[0],minmethod=0;
for(int i=0;i<4;i++)
if(rank[i]<min){
min=rank[i];
minmethod=i;
}
cout<<min+1<<':'<<minmethod+1<<endl;
}
cout<<endl;
}
}