题目传送门:请用sort
通过代码:
#include <bits/stdc++.h>
using namespace std;
struct FT{
int score,ball,net;
string s;
}ft[1000];
bool cmp(FT a,FT b){
if(a.score!=b.score){
return a.score>b.score;
}
if(a.net!=b.net){
return a.net>b.net;
}
if(a.ball!=b.ball){
return a.ball>b.ball;
}
return a.s<b.s;
}
void caculate(int p,int q,int ct){
if(p>q)ft[ct].score+=3;
else if(p==q)ft[ct].score+=1;
ft[ct].ball+=p;
ft[ct].net+=(p-q);
}
void clean(int x){
for(int i=1;i<=x;i++){
ft[i].score=0;
ft[i].ball=0;
ft[i].net=0;
ft[i].s='/0';
}
}
int n,p,q,ct,j,ctt,mid;
string a,b;
int main() {
while(cin>>n){
ct=1;
for(int i=1;i<=n*(n-1);i++){
cin>>a>>b>>b;
scanf("%d:%d",&p,&q);//get data
ctt=0;//renew ctt
for(j=1;j<=ct;j++)//caculate data a
if(a==ft[j].s){ctt=1;break;}
if(ctt==1)caculate(p,q,j);
else{
ft[ct].s=a;
caculate(p,q,ct);
ct++;
}
ctt=0;//rener ctt
for(j=1;j<=ct;j++)//caculate data b
if(b==ft[j].s){
ctt=1;break;}
if(ctt==1)caculate(q,p,j)
else{ft[ct].s=b;
caculate(q,p,ct);
ct++;
}
}
sort(ft+1,ft+1+n,cmp);
for(int i=1;i<=n;i++)
cout<<ft[i].s<<" "<<ft[i].score<<endl;
clean(ct);
cout<<endl;
}
return 0;
}//这个编辑器的Tab符有点长,格式见谅
思路梳理:本题关键步骤有两步,即收集各球队的分数、净进球数、总进球数,并想办法根据上述三种数据和球队名称字典序对这些球队排序。说实话,博主才疏学浅,只知道sort的正、倒排序(定义一个cmp函数),并不清楚怎样用sort进行多条件排序,所以想重新写一个排序的函数,第一遍这样AC了,但想题目叫做请用sort,肯定涉及到sort的高级用法,便百度到sort双(多)关键字排序,如法炮制,第二次提交时考虑不全,下面分享错误代码:
bool cmp(FT a,FT b){
if(a.score>b.score)return true;
else if(a.score<b.score)return false;
else{
if(a.ball>b.ball)return true;
else if(a.ball<b.ball)return false;
else{
if(a.net>b.net)return true;
else if(a.net<b.net)return false;
else{
if(a.s>b.s)return true;
else if(a.s<b.s)return false;
}
}
}
}
显然没有考虑相等的情况😭
因为与球队的数据要绑在一起,我首先想到的是结构体,不知道还有没别的好用的结构?求看到的童鞋援助。。。
开始我处理数据用的是一个函数,但是不知道处理第二组数据时结构体数组怎么清零,就在主函数内定义了结构体数组,以为这样每次初始化会为零,但没有用,只好处理完一组数据之后就用循环给结构体清零,为了是程序更加明了,我还是改改。
絮絮叨:肺炎疫情使寒假无限期延长,没想到寒假已经开始了将近半个月,而在这么长的假期中,我看书学习的时间并不多,竟有些惭愧,以后我遇到有价值的题目和一些问题,一定马上放在博客上,和大家共同进步。