#include <stdio.h>
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int exist[20]={0};
int n;
cin>>n;
int *a=new int[n] ;
for (int i = 0; i < n; i++){
cin>>a[i];
int flag=0;
for (int j = 0; j<20;j++)
{
if(a[i]<=5-exist[j]){
for(int k=exist[j]+1;k<exist[j]+a[i];k++){
cout<<5*j+k<<" ";
}
cout<<5*j+exist[j]+a[i]<<endl;
exist[j]+=a[i];
flag=1;
break;
}
}
if(!flag){
for(int j=0;j<20;j++){
for(int k=exist[j]+1;k<=5;k++){
a[i]--;
if(a[i])
cout<<j*5+k<<" ";
else
cout<<j*5+k<<endl;
}
}
}
}
return 0;
}
满分代码终于调试出来了
思路:循环20行搜索,能在一行中放下就进行排列并输出;
如果flag始终为0,则不能在一行并列刚下,循环20行搜索空位进行放下;
错误分析:刚开始 一直考虑并列放,和输出显示的问题,并列放不下的问题,导致报错很多次;
循环输出,及时反应;
使用const的问题。
需要仔细,谨慎。
-------------------------------------------------------------分割线-------------------------------------------
今天重新写了一遍,一直是90分,没有搞明白漏洞如何修改;先记录一下
感觉应该错误是出最后处理不连续的座位中间;还需要再想一下;好丧啊啊啊啊啊啊啊
#include <iostream>
#include <algorithm>
using namespace std;
const int N=21;
int a[N];
int main(){
for(int i=1;i<N;i++){
a[i]=5;
}
int n,t;
cin>>n;
while(n--){
cin>>t;
bool flag=false;
for(int i=1;i<N;i++){
if(a[i]>=t){
flag=true;
for(int j=1;j<t;j++){
cout<<(5-a[i])+5*(i-1)+j<<" ";
}
cout<<(5-a[i])+5*(i-1)+t<<endl;
a[i]=a[i]-t;
// break;
}
if(flag) break;
}
if(!flag){
for(int i=1;i<N;i++){
if(a[i]<t){
for(int j=1;j<a[i];j++){
cout<<(5-a[i])+5*(i-1)+j<<" ";
}
cout<<(5-a[i])+5*(i-1)+a[i]<<endl;
t=t-a[i];
a[i]=0;
if(t==0) break;
}
}
}
}
return 0;
}