题目:http://118.190.20.162/view.page?gpid=T46
解题思路:简单模拟,就一排一排的硬模拟。
代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
int row[22];
int rem[9];
int n,g;
int main(){
for(int i=1;i<=20;i++){
row[i]=5;
}
cin>>n;
int y=1;
for(int i=0;i<n;i++){
cin>>g;
memset(rem,0,sizeof(rem));
int j=y;
int r=1;
while(row[j]<g&&j<=20)j++;///是否有连续空座?
if(j<=20){///有连续空位
int k,p=5-row[j];
row[j]-=g;
for(k=1;k<=g;k++){
rem[r++]=(j-1)*5+p+k;
}
}
else{
j=y;//这一步最开始竟然忘了写了
while(g){
if(row[j]>0){///未填满
int k,p=5-row[j];
int q=row[j];
g-=row[j];
row[j]=0;
for(k=1;k<=q;k++){
rem[r++]=(j-1)*5+p+k;
}
}
else{///已填满
y=j;//j记录已填满的排数
j++;
}
}
}
for(int c=1;c<=5;c++){
if(rem[c]){
cout<<rem[c];
if(rem[c+1]){
cout<<" ";
}
}
}
if(i!=n-1)
cout<<endl;
}
return 0;
}