有两个坑:1.如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4.没有第三名。2.要求排名的国家数M,是给选出来的国家进行排名。
解法:结构体+sort
#include<bits/stdc++.h>
using namespace std;
struct PM
{
double data;
int num;//记录城市编号
};
bool cmp(PM a,PM b)
{
return a.data>b.data;
}
int main()
{
int n,m;
while(cin>>n>>m)
{
int rs,pos[1005];
double A[1005],B[1005],C[1005],D[1005];
PM a[1005],b[1005],c[1005],d[1005];
for(int i=0;i<n;i++)
{
cin>>A[i]>>B[i]>>rs;
C[i]=A[i]/(rs*1.0);
D[i]=B[i]/(rs*1.0);
}
for(int i=0;i<m;i++)
{
scanf("%d",&pos[i]);
a[i].data=A[pos[i]];
a[i].num=pos[i];
b[i].data=B[pos[i]];
b[i].num=pos[i];
c[i].data=C[pos[i]];
c[i].num=pos[i];
d[i].data=D[pos[i]];
d[i].num=pos[i];
}
sort(a,a+m,cmp);
sort(b,b+m,cmp);
sort(c,c+m,cmp);
sort(d,d+m,cmp);
int opa[1005],opb[1005],opc[1005],opd[1005];//加入并列的排名
for(int i=0;i<m;i++)
{
opa[i]=i+1;
while(i+1<n&&a[i].data==a[i+1].data)
{
opa[i+1]=opa[i];
i++;
}
}
for(int i=0;i<m;i++)
{
opb[i]=i+1;
while(i+1<n&&b[i].data==b[i+1].data)
{
opb[i+1]=opb[i];
i++;
}
}
for(int i=0;i<m;i++)
{
opc[i]=i+1;
while(i+1<n&&c[i].data==c[i+1].data)
{
opc[i+1]=opc[i];
i++;
}
}
for(int i=0;i<m;i++)
{
opd[i]=i+1;
while(i+1<n&&d[i].data==d[i+1].data)
{
opd[i+1]=opd[i];
i++;
}
}
int op[5];//各种排名方式的排名
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
if(a[j].num==pos[i])
{
op[1]=opa[j];
break;
}
}
for(int j=0;j<m;j++)
{
if(b[j].num==pos[i])
{
op[2]=opb[j];
break;
}
}
for(int j=0;j<m;j++)
{
if(c[j].num==pos[i])
{
op[3]=opc[j];
break;
}
}
for(int j=0;j<m;j++)
{
if(d[j].num==pos[i])
{
op[4]=opd[j];
break;
}
}
int minn=1005,j;
for(int i=1;i<=4;i++)
{
if(op[i]<minn)
{
minn=op[i];
j=i;
}
}
cout<<minn<<":"<<j<<"\n";
}
cout<<"\n";
}
return 0;
}