https://vjudge.net/problem/UVA-10698
注意字母对应,大小写
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
char c1[20],c2[20],c[20];
struct AA{
string name;
string name2;
int pts,gms,goal,suffer,idx,gs;
double p;
void print(bool f,int cnt){
if(!f)printf("%2d.",cnt);
else printf(" ");
printf("%16s%4d%4d%4d%4d%4d",name.c_str(),pts,gms,goal,suffer,gs);
if(gms==0)puts(" N/A") ;
else printf("%7.2lf\n",p);
}
void input(){
gets(c);
name=c;
name2.clear();
int len=strlen(c);
for(int i=0;i<len;i++)
name2+=tolower(c[i]);
}
};
bool cmp(AA& a,AA& b){
return a.name2<b.name2;
}
bool cmp2(AA& a,AA& b){
if(a.pts==b.pts){
if(a.gs==b.gs){
if(a.goal==b.goal){
return a.idx<b.idx;
}return a.goal>b.goal;
}return a.gs>b.gs;
}return a.pts>b.pts;
}
bool eq(AA& a,AA& b){
if(a.pts==b.pts&&a.gs==b.gs&&a.goal==b.goal){
return true;
}return false;
}
typedef map<string,int> msi;
int main(){
int n,m;
int z=1;
while(scanf("%d%d",&n,&m),n||m){
if(z==1)z++;
else puts("");
getchar();
vector<AA> v(n);
for(int i=0;i<n;i++){
v[i].input();
}
sort(v.begin(),v.end(),cmp);
msi msi1;
for(int i=0;i<n;i++){
v[i].idx=i;
msi1[v[i].name]=i;
}
int goal1,goal2,n1,n2;
for(int i=0;i<m;i++){
scanf("%s%2d -%2d %s",c1,&goal1,&goal2,c2);
n1=msi1[c1];
n2=msi1[c2];
v[n1].gms++;v[n2].gms++;
v[n1].goal+=goal1;v[n1].suffer+=goal2;
v[n2].goal+=goal2;v[n2].suffer+=goal1;
if(goal1<goal2){
v[n2].pts+=3;
}else if(goal1>goal2){
v[n1].pts+=3;
}else{
v[n1].pts+=1;
v[n2].pts+=1;
}
}
for(int i=0;i<n;i++){
v[i].gs=v[i].goal-v[i].suffer;
if(!v[i].gms)continue;
v[i].p=(v[i].pts*100.0)/(3.0*v[i].gms);
}
sort(v.begin(),v.end(),cmp2);
v[0].print(false,1);
for(int i=1;i<v.size();i++)
if(eq(v[i],v[i-1]))v[i].print(true,i+1);
else v[i].print(false,i+1);
}
}