就是模拟从每个队依次挑出一个人,模拟的时候就给其赋值同时会记录当前是这个队的第几个人,如果超过这个队的人数就不再赋值,如果最后只剩下一个队,那么编号就要依次加2.
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
vector<int>m[110]; ///存储每个学校的同学的编号
int vis[110];
int main()
{
int n,a[110],sum = 0,len = 0,ren = 0;
scanf("%d",&n);
for(int i = 0;i < n; i++)
{
scanf("%d",&a[i]);
a[i] *= 10;
sum += a[i];
}
for(int i = 1;;)
{
int t = 0;
while(t < n)
{
if(m[t].size() < a[t])
{
ren++;
m[t].push_back(i);
if(len + 1 == n) ///最后一个队伍的时候队员编号加2
i += 2;
else ///其它的队伍加1
i += 1;
}
if(!vis[t] && m[t].size() >= a[t])
{
vis[t] = 1;
len++;
}
t++;
}
if(ren == sum)
break;
}
for(int i = 0;i < n; i++)
{
printf("#%d\n",i+1);
for(int j = 0;j < m[i].size(); j++)
{
if(j % 10)
printf(" ");
printf("%d",m[i][j]);
if(j % 10 == 9)
printf("\n");
}
if(m[i].size() % 10 != 0)
printf("\n");
}
return 0;
}