(1)题目描述
(2)算法思想
控制好三个变量——每一排的剩余个数、每一个座位的编号以及每一个座位的分配情况即可。
首先从第一排开始扫描,若有满足剩余个数的排则占据其剩余的座位;若直到最后一排仍无法满足分配在同一排的需求则从第一排开始寻找空闲座位直接安排即可。
(3)代码实现
#include<vector>
#include<iostream>
using namespace std;
struct row {
int leftnum;
int seatid[5];
int occupied[5];
};
void distribute(vector<int> &ans, row &R, int &tiknum) {
for(int k=0; k<5; k++) {
if(tiknum==0)
break;
else if(!R.occupied[k]) {
tiknum--;
R.leftnum--;
R.occupied[k]=1;
ans.push_back(R.seatid[k]);
}
}
}
int main() {
row R[20];
for(int i=0; i<20; i++) {
R[i].leftnum=5;
for(int j=0; j<5; j++)
R[i].occupied[j]=0;
for(int j=0; j<5; j++)
R[i].seatid[j]=i*5+j+1;
}
int n;
cin>>n;
vector<int> ans[n];
for(int i=0; i<n; i++) {
int j,tiknum;
cin>>tiknum;
for(j=0; j<20; j++) {
if(R[j].leftnum<tiknum)
continue;
else {
distribute(ans[i],R[j],tiknum);
break;
}
}
if(j==20) {
for(j=0; j<20; j++) {
if(tiknum==0)
break;
distribute(ans[i],R[j],tiknum);
}
}
}
for(int i=0; i<n; i++) {
for(int j=0; j<ans[i].size(); j++) {
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
return 0;
}