一、题目简介
二、实例代码
代码如下(示例):
#include<iostream>
using namespace std;
int seat[21]={0};
初始化数组,数组每一项代表每一行被占用的座位数。
void put(int p){
for(int i=0;i<20;i++){
while(seat[i]<5){
cout<<i*5+1+seat[i]<<" ";
seat[i]++;
p--;
if(p==0){
cout<<endl;
return;
}
}
}
}
如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
例如输入
21
4 4 4…4(20个) 2
时,应该最后输出5 10。
int main(){
int n,p;
cin>>n;
for(int i=0;i<n;i++){
cin>>p;
bool over = false;
for(int i=0;i<20;i++){
if(p+seat[i]<6){
for(int j=1;j<=p;j++)
cout<<i*5+seat[i]+j<<" ";
cout<<endl;
seat[i]+=p;
over = true;
break;
}
}
如果每一行已被占用座位数与此次购买的座位数之和不超过5,则在此行已被占用的座位号后依次输出,并更改此行已被占用的座位数。
if(!over){
put(p);
}
}
}
总结
原来使用二维数组和三个循环进行嵌套进行判断输出的办法会导致运行超时,使得程序只有90分。后来经过算法改进使用一维数组,大大降低时间复杂度。