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