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 res;

int rankk[1005];

map mnum;

map 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

}

bool operator==(const team& b) const

{

return po==b.po&&su==b.su&&total==b.total;

}

};

void solve(int l,int r,vector p)

{

vector 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

{

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 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

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;

}}}}}