题目:点击打开链接
纯模拟题,模拟一个小组中的出线情况。注意情况:
1、胜3平1负0不多说。分数相等比较净胜球,净胜球相等比较进球数,进球数相等输出字典序。
2、无论怎样,输出总是按照字典序。
这个问题基本上是考排序的细节,当然,还有字符串的处理。寻找'-'字符,可以通过string类中的int find_first_of(char a)来直接解决。找到队伍的位置操作便是。变量略多,最好取一些清晰易懂的名字,别写来写去把自己绕进去了。。1A,难得。。
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
class team
{
public:
string teamname;
int marks;
int goal;
int loss;
};
team football[55];
bool cmp(team a,team b)
{
if(a.marks!=b.marks)
return a.marks>b.marks;
else
{
int adec=a.goal-a.loss;
int bdec=b.goal-b.loss;
if(adec!=bdec)
{
return adec>bdec;
}
else
{
return a.goal>b.goal;
}
}
}
bool cmpdic(team a,team b)
{
return a.teamname<b.teamname; //不要用strcmp,貌似只比较了首字母
}
int main()
{
int teamnum;
cin>>teamnum;
for(int i=1;i<=teamnum;i++)
{
string name;
cin>>name;
football[i].teamname=name;
}
for(int j=1;j<=(teamnum*(teamnum-1)/2);j++)
{
string teaminfo;//原始信息
string teama,teamb;//队名记录
int marksa,marksb;//分数记录
int rema,remb;//位置记录
char temppos;
cin>>teaminfo;
int pos=teaminfo.find_first_of('-',0);
for(int p=0;p<pos;p++)
teama+=teaminfo[p];
for(int t=pos+1;t<teaminfo.size();t++)
teamb+=teaminfo[t];
//teamb=teaminfo.assign(teaminfo.begin()+pos,teaminfo.end()); //不知为何不能用
cin>>marksa>>temppos>>marksb;
for(int j=1;j<=teamnum;j++)
{
if(football[j].teamname==teama)
{
rema=j;
}
if(football[j].teamname==teamb)
{
remb=j;
}
}
if(marksa>marksb)
{
football[rema].marks+=3;
}
else if(marksa==marksb)
{
football[rema].marks+=1;
football[remb].marks+=1;
}
else
{
football[remb].marks+=3;
}
football[rema].goal+=marksa;
football[rema].loss+=marksb;
football[remb].goal+=marksb;
football[remb].loss+=marksa;
// cout<<teama<<endl;
// cout<<teamb<<endl;
}
sort(football+1,football+teamnum+1,cmp);
sort(football+1,football+(teamnum/2)+1,cmpdic);
for(int k=1;k<=(teamnum/2);k++)
{
cout<<football[k].teamname<<endl;
}
return 0;
}