思路:用数组a[20]记录每一排剩余的座位数。每次分配单独处理,a[i]>=val&&i!=20时说明够相邻分配,开始分配;i==20时说明每一排都不够分配,这样按不相邻分配。
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a[20];
for(int i = 0; i < 20; i++){
a[i] = 5;//初始化每排剩余的数
}
while(n--){
int val;
cin>>val;
int i;
for(i = 0; i < 20; i++){
if(a[i] >= val)//判断剩余座位是否够分配
break;
}
if(i == 20){//不够分配
for(int j = 0; j < 20; j++){
if(a[j] != 0){//有剩余座位
while(val-- && a[j]--)
cout<<j*5+5-a[j]<<' ';
}
}
}
else{//够分配
for(int k = 0, j = i*5+6-a[i]; k < val; k++,j++)//k计分配数,j是座位编号
cout<<j<<' ';
a[i] -= val;//更改剩余座位数
}
cout<<endl;
}
return 0;
}
参考文档
[1] CCF_201612-2_火车购票