解题思路:
用一个二维的vector保存座位的状态,vector的第一维长度固定,表示20排,第二维的长度不固定,这一排有几个座位被占用了就有几个元素,如果当前排剩下的位置大于等于p就从小到大占用这一排的p个座位,输出这几个座位对应的序号,如果所有排剩余的座位都小于p,就从较小的排开始分若干排的座位给p个人占座。
#include<bits/stdc++.h>
using namespace std;
vector<vector<int> > mp(21);//这里初始化mp的第一维的长度为21,我们不用mp[0]所以初始化为21
void func(int p)
{
for(int i=1;i<=20;i++)//遍历20排座位
{
if(5-mp[i].size()>=p)//当前排剩余的座位大于等于p
{
while(p)
{
p--;
if(p==0)
{
cout<<(i-1)*5+mp[i].size()+1<<endl;//如果是本次指令最后一个占座的人输出换行
}
else
{
cout<<(i-1)*5+mp[i].size()+1<<" ";
}
mp[i].push_back(1);//往这一排加入元素1,其实加入数字几都可以,只是为了占位置
}
return ;
}
}
//如果没有哪一行剩余的座位大于等于p
for(int i=1;i<=20;i++)
{
while(mp[i].size()!=5&&p)//从第1行开始,按照座位号从小到大的顺序占座
{
mp[i].push_back(1);
p--;
if(p==0)
cout<<(i-1)*5+mp[i].size()<<endl;//对本次指令占座的最后一个人特殊处理
else
cout<<(i-1)*5+mp[i].size()<<" ";
}
}
return ;
}
int main(void)
{
int n;
int p;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>p;
func(p);
}
return 0;
}