问题分析:用数组a[20]表示每排被占用的座位数,逐排扫描,先放相邻编号的座位,然后再放不连续的座位。
提交后100分的C++程序如下
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int a[20], n, p; //数组表示每排被占用了多少个
memset(a, 0, sizeof(a));
cin >> n;
while(n--)
{
cin >> p;
bool flag = 0;
for(int i = 0; i < 20; i ++) //逐排扫描,先把票安排在相邻编号的座位上
{
if(p + a[i] <= 5)
{
for(int j = a[i]+1; j < a[i]+p; j ++)
{
cout << 5*i+j <<" ";
}
cout << 5*i+a[i]+p <<endl;
a[i] += p;
flag = 1;
break;
}
}
if(!flag)
{
for(int i = 0; i < 20; i ++)
{
for(int j = a[i]+1; j <= 5; j ++)
{
a[i] = j; //更新
if(p) cout << 5*i+j <<" ";
else{
cout << 5*i+j<<endl;
break;
}
p --;
}
if(!p) break;
}
}
}
return 0;
}
------------------------------------更新-----------------------------------
#include <iostream>
using namespace std;
int a[20];//记录每行空座数
int main()
{
for(int i = 0; i < 20; i ++) //初始化
{
a[i] = 5;
}
int n, v, t, cnt;
cin >> n;
while(n --)
{
cin >> v;
cnt = 0;
for(int i = 0; i < 20; i ++) //一排可以放下
{
t = a[i];
if(a[i] >= v){
for(int j = i*5+6-t; j < i*5+6-t+v; j ++)
{
cout << j << " ";
a[i] --;
}
cout << endl;
break;
}else{
cnt ++;
continue;
}
}
if(cnt == 20) //一排放不下
{
for(int i = 0; i < 20; i ++)
{
t = a[i];
for(int j = i*5+6-t; j < i*5+6; j ++){
if(v != 0){
cout << j << " ";
v --;
a[i] --;
}else{
cout << endl;
break;
}
}
}
}
}
return 0;
}