为了账号安全,请及时绑定邮箱和手机立即绑定

7-3 天梯赛座位分配 (20分) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。

#include<bits/stdc++.h>

 

using namespace std;

 

typedef long long ll;

 

int main()

{

    int n;

    while(~scanf("%d",&n))

    {

        int a[n],b[n],cnt[n]={0},maxn=INT_MIN,flag=1;

        for(int i=0;i<n;i++)

        {

            scanf("%d",&a[i]);

            b[i]=a[i];

            a[i]*=10;

 

            if(maxn<a[i])

                maxn=a[i];

        }

 

        if(n==1) // 1的特殊情况

        {

            printf("#1n");

            int from=-1;

            for(int i=0;i<b[0];i++)

            {

                for(int j=0;j<10;j++)

                {

                    if(j==0)

                        printf("%d",from+=2);

                    else

                        printf(" %d",from+=2);

                }

                puts("");

            }

            continue;

        }

 

        sort(b,b+n);

        if(b[n-1]==b[n-2])

            flag=0;

 

 

        vector<int> v[n];

        int last=1;

        int k=1,tmax=b[n-2]*10;

        for(int j=0;j<maxn;j++)

        {

            for(int i=0;i<n;i++)

            {

                if(a[i]>cnt[i])

                {

                    cnt[i]++;

                    if(cnt[i]>tmax && flag==1)

                    {

                        if(last) 

                        {

                            if(k-v[i][tmax-1]!=1)

                                k--;

                            last=0;

                        }

 

                        k++;

                        v[i].push_back(k++);

                    }

                    else

                        v[i].push_back(k++);

                }

            }

        }

 

        for(int i=0;i<n;i++)

        {

            printf("#%dn",i+1);

            int count=0;

            for(int j=0;j<a[i];j++)

            {

                if(count==0)

                    printf("%d",v[i][j]);

                else

                    printf(" %d",v[i][j]);

                count++;

 

                if(count>=10)

                    puts(""),count=0;

            }

        }

    }

 

    return 0;

}


正在回答

举报

0/150
提交
取消

7-3 天梯赛座位分配 (20分) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信