这道题有个天坑: 输入数据中人口可能是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;
    }
}