AcWing 3233. 火车购票
原题链接
简单
作者:
syl
,
2021-03-17 10:31:11
,
所有人可见
,
阅读 937
/*
1. 可以在一起,确定行,确定列,输出
2.不可以一起,把他们拆散,从小到大在空子里逐个放进去
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 22;
int n;
bool st[22][7];
int num[22];
int main(){
//初始化
for(int i=1;i<=22;i++) num[i]=5;
cin>>n;
while(n--){
int x;
cin>>x;
int temp=x;
//确定行
int row = -1;
for(int i=1;i<=20;i++){
if(temp<=num[i]){
row = i;
break;
}
}
//如果没找到 or 找到了行
if(row==-1){ //没找到行,逐个插空
//先确定二维坐标
for(int i=1;i<=20;i++){
for(int j=1;j<=5;j++){
if(temp>=1 && !st[i][j]){
//插空,输出一维坐标
int pos = 5*(i-1)+j;
cout<<pos<<" ";
st[i][j] = true;
num[i]--;
temp--;
}
if(temp==0) break;
}
if(temp==0) break;
}
cout<<endl;
}
else{ //找到了行,确定列
//确定列
int col;
for(int j=1;j<=5;j++){
if(!st[row][j]){
col = j;
break;
}
}
//分别输出一维坐标
while(temp--){
int pos = 5*(row-1)+col;
st[row][col] =true;
num[row]--;
col++;
cout<<pos<<" ";
}
cout<<endl;
}
}
return 0;
}