0
点赞
收藏
分享

微信扫一扫

团体程序设计天梯赛-练习集 - L1-049. 天梯赛座位分配(20 分)


题目链接:​​点击打开链接​​

题目大意:

解题思路:模拟题(16分的天坑),16分的童鞋:关键在于,3 4 2; 3 3 4 3; 3 1 1; 观察这几组,最后一个学校的剩余的队伍的第一个队伍的第一个数据是致命点,如果是从其他学校转过来的计算开始,应该+1即可,而不是+2;如果是从当前学校转过来的计算开始,应该+2

AC 代码

#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("#1\n");
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) // 高能!高能!16分的同学看过来,这里第一开始需要特殊处理,i.e. 3 3 1 3 3 4 3 3 4 2
{
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("#%d\n",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 条评论