2012-0022
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
模拟题,题目描述是 一只小组有n支球队,小组内循环赛,一共有n*(n-1)/2场比赛,然后通过给定的比赛结果根据一定的规则求出排名。
规则:1.胜一场积3分,平一场积1分,负一场积0分 排名
2.如果有同分队伍,进行以下比较
a)同分队伍相互比赛的积分
b)同分队伍相互比赛的净胜球
c)同分队伍相互比赛的总进球
d)如果经过a)b)c)的比较,还有至少两只队伍无法区别排名,那么对这些队伍再进行a)b)c的比较,直到a)b)c)无法区分排名
e)所有比赛净胜球
f)所有比赛总进球
g)官方排名
标程:
{{{
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<vector>
#include<stack>
#include<deque>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
int score[1005][1005];
string name[1005];
int supeball[1005];
int totalball[1005];
vector<int> res;
int rankk[1005];
map<string,int> mnum;
map<string,int> mrankk;
int m;
int n;
class team
{
public:
int no,po,su,total;
team(int n,int p,int s,int t)
{
no=n,po=p,su=s,total=t;
}
bool operator<(const team& b)const
{
return po<b.po||(po==b.po&&su<b.su)||(po==b.po&&su==b.su&&total<b.total);
}
bool operator==(const team& b) const
{
return po==b.po&&su==b.su&&total==b.total;
}
};
void solve(int l,int r,vector<team> p)
{
vector<team> temp;
if(l==r)
{
res.push_back(p[l].no);
return;
}
else
{
for(int i=l;i<=r;i++)
{
temp.push_back(team(p[i].no,0,0,0));
for(int j=l;j<=r;j++)
{
if(i==j)
continue;
else
{
int sign=score[p[i].no][p[j].no]-score[p[j].no][p[i].no];
temp.back().su+=sign;
temp.back().total+=score[p[i].no][p[j].no];
if(sign>0)
{
temp.back().po+=3;
}
else if(sign==0)
{
temp.back().po+=1;
}
}
}
}
sort(temp.begin(),temp.end());
int ll=0;
for(int i=1;i<temp.size();i++)
{
if(!(temp[ll]==temp[i]))
{
solve(ll,i-1,temp);
ll=i;
}
}
if(ll==0)
{
for(int i=0;i<temp.size();i++)
{
temp[i].po=supeball[temp[i].no];
temp[i].su=totalball[temp[i].no];
temp[i].total=rankk[temp[i].no];
}
sort(temp.begin(),temp.end());
for(int i=0;i<temp.size();i++)
res.push_back(temp[i].no);
}
else
{
solve(ll,temp.size()-1,temp);
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int icase=0;
while(cin>>n)
{
if(icase)
{
cout<<"\n";
}
icase=1;
vector<team> p;
mnum.clear();
mrankk.clear();
res.clear();
p.clear();
memset(score,0,sizeof(score));
memset(supeball,0,sizeof(supeball));
memset(totalball,0,sizeof(totalball));
memset(rankk,0,sizeof(rankk));
int index=0;
for(int i=0;i<n;i++)
p.push_back(team(i,0,0,0));
for(int i=0;i<n*(n-1)/2;i++)
{
string s1,s2;
int p1,p2;
char temp;
cin>>s1>>p1>>temp>>p2>>s2;
//cout<<s1<<"\n";
if(!mnum.count(s1))
{
name[index]=s1;
mnum[s1]=index++;
}
if(!mnum.count(s2))
{
name[index]=s2;
mnum[s2]=index++;
}
if(p1>p2)
p[mnum[s1]].po+=3;
else if(p2>p1)
p[mnum[s2]].po+=3;
else
{
p[mnum[s1]].po++;
p[mnum[s2]].po++;
}
score[mnum[s1]][mnum[s2]]=p1;
score[mnum[s2]][mnum[s1]]=p2;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)
continue;
else
{
supeball[i]+=score[i][j]-score[j][i];
totalball[i]+=score[i][j];
}
}
}
cin>>m;
for(int i=0;i<m;i++)
{
string s;
cin>>s;
if(mnum.count(s))
{
rankk[mnum[s]]=m-i;
}
}
sort(p.begin(),p.end());
int l=0;
for(int i=1;i<n;i++)
{
if(p[l].po!=p[i].po)
{
solve(l,i-1,p);
l=i;
}
}
solve(l,n-1,p);
for(int i=n-1;i>=0;i--)
{
cout<<name[res[i]]<<"\n";
}
}
//fclose(stdin);
//fclose(stdout);
return 0;
}}}}}
模拟题,题目描述是 一只小组有n支球队,小组内循环赛,一共有n*(n-1)/2场比赛,然后通过给定的比赛结果根据一定的规则求出排名。
规则:1.胜一场积3分,平一场积1分,负一场积0分 排名
2.如果有同分队伍,进行以下比较
a)同分队伍相互比赛的积分
b)同分队伍相互比赛的净胜球
c)同分队伍相互比赛的总进球
d)如果经过a)b)c)的比较,还有至少两只队伍无法区别排名,那么对这些队伍再进行a)b)c的比较,直到a)b)c)无法区分排名
e)所有比赛净胜球
f)所有比赛总进球
g)官方排名
标程:
{{{
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int score[1005][1005];
string name[1005];
int supeball[1005];
int totalball[1005];
vector
int rankk[1005];
map
map
int m;
int n;
class team
{
public:
int no,po,su,total;
team(int n,int p,int s,int t)
{
no=n,po=p,su=s,total=t;
}
bool operator<(const team& b)const
{
return po } bool operator==(const team& b) const { return po==b.po&&su==b.su&&total==b.total; } }; void solve(int l,int r,vector { vector if(l==r) { res.push_back(p[l].no); return; } else { for(int i=l;i<=r;i++) { temp.push_back(team(p[i].no,0,0,0)); for(int j=l;j<=r;j++) { if(i==j) continue; else { int sign=score[p[i].no][p[j].no]-score[p[j].no][p[i].no]; temp.back().su+=sign; temp.back().total+=score[p[i].no][p[j].no]; if(sign>0) { temp.back().po+=3; } else if(sign==0) { temp.back().po+=1; } } } } sort(temp.begin(),temp.end()); int ll=0; for(int i=1;i { if(!(temp[ll]==temp[i])) { solve(ll,i-1,temp); ll=i; } } if(ll==0) { for(int i=0;i { temp[i].po=supeball[temp[i].no]; temp[i].su=totalball[temp[i].no]; temp[i].total=rankk[temp[i].no]; } sort(temp.begin(),temp.end()); for(int i=0;i res.push_back(temp[i].no); } else { solve(ll,temp.size()-1,temp); } } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int icase=0; while(cin>>n) { if(icase) { cout<<"\n"; } icase=1; vector mnum.clear(); mrankk.clear(); res.clear(); p.clear(); memset(score,0,sizeof(score)); memset(supeball,0,sizeof(supeball)); memset(totalball,0,sizeof(totalball)); memset(rankk,0,sizeof(rankk)); int index=0; for(int i=0;i p.push_back(team(i,0,0,0)); for(int i=0;i { string s1,s2; int p1,p2; char temp; cin>>s1>>p1>>temp>>p2>>s2; //cout< if(!mnum.count(s1)) { name[index]=s1; mnum[s1]=index++; } if(!mnum.count(s2)) { name[index]=s2; mnum[s2]=index++; } if(p1>p2) p[mnum[s1]].po+=3; else if(p2>p1) p[mnum[s2]].po+=3; else { p[mnum[s1]].po++; p[mnum[s2]].po++; } score[mnum[s1]][mnum[s2]]=p1; score[mnum[s2]][mnum[s1]]=p2; } for(int i=0;i { for(int j=0;j { if(i==j) continue; else { supeball[i]+=score[i][j]-score[j][i]; totalball[i]+=score[i][j]; } } } cin>>m; for(int i=0;i { string s; cin>>s; if(mnum.count(s)) { rankk[mnum[s]]=m-i; } } sort(p.begin(),p.end()); int l=0; for(int i=1;i { if(p[l].po!=p[i].po) { solve(l,i-1,p); l=i; } } solve(l,n-1,p); for(int i=n-1;i>=0;i--) { cout< } } //fclose(stdin); //fclose(stdout); return 0; }}}}}