定义一个长度为20的一维数组a 表示每排剩余的座位数量,那么第 i 排剩余座位的起始编号就应该是i*5+6-a[i]。每次给定一个购票数量x,就遍历数组a查找有无剩余座位数量大于等于x的元素,有则从起始编号输出x个递增的数字,若没有则从有剩余座位的每一排中输出其所有剩余座位直至输出座位总数为x。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 20;
int a[maxn];//每排剩余座位数
int main() {
int n;cin>>n;
//memset(a,5,sizeof(a));//不能用它将int数组初始化为0和-1之外的其他值
for(int i=0;i<maxn;i++) a[i]=5;
while(n--){
int x;cin>>x;
int i=0;
while(i<20&&a[i]<x)++i;//查找是否有剩余座位数多于x的排
if(i<20){//有,从该排起始编号开始输出k个连续递增数字
int start=i*5+6-a[i];//计算座位标号
for(int j=0;j<x;j++)
cout<<start+j<<' ';
a[i]-=x;//更新剩余座位数
}
else{//没有,从有剩余座位的排中输出空闲座位直至输出空余座位总数为x
for(int j=0;j<20&&x>0;++j)
if(a[j]){//有剩余座位
int start=j*5+6-a[j];
for(int k=0;k<min(a[j],x);++k)
cout<<start+k<<' ';
a[j]=x>a[j]?0:a[j]-x;//更新座位数
x-=a[j];//更新剩余要选座位数
}
}
cout<<endl;
}
return 0;
}