
二刷:
创建一个a[101]的数组存储编号,五个座位为一排。给定票数c,先检查是否有连续的一排c个座位(5-j%5+1求本排空余座位数),没有的话则继续下一排((j/5+1)*5),要注意j%5==0(j=5,10,15……)的情况要单独处理。用flag标记是否有连续座位,没有的话,从头检查分散的座位,从小到大的编号找够c个。注意每次选定座位之后,把相应的a[j]=1;
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[101]={0};
int c;
for(int i=0;i<n;i++)
{
cin >> c;
int flag=0;
for(int j=1;j<=100;j++)
{
if(a[j]==0)
{
int yu;
if(j%5==0) yu=1;
else yu=5-j%5+1;
if(yu>=c)
{
flag=1;
for(int k=j;k<j+c;k++)//这一排连续够用
{
cout << k << " ";
a[k]=1;
}
cout << endl;
}
else
{
if(j%5==0) continue;
else j=(j/5+1)*5;//检测下一排
}
if(flag) break;
}
}
if(!flag)
{
for(int j=1;j<=100;j++)
{
if(a[j]==0)
{
cout << j << " ";
c--;
a[j]=1;
}
if(c==0) break;
}
cout << endl;
}
}
return 0;
}
一刷思路:把100个位子分成20组,用一个数组记录每一组的空位数,每次寻找时,先找是否有连续空位足够的小组,如果找不到连续空位,再从头一个一个遍历空位。
#include <iostream>
using namespace std;
int main()
{
int n,p;
int group[20];
int seat[101]={0};
cin >> n;
for(int i=0;i<20;i++)
{
group[i]=5;
}
for(int i=0;i<n;i++)
{
cin >> p;
int flag=0;
for(int j=0;j<20;j++)
{
if(group[j]>=p)
{
flag=1;
for(int k=5*j+1;k<=5*j+5&&p>0;k++)
{
if(seat[k]==0)
{
cout << k << " ";
seat[k]=1;
group[j]--;
p--;
}
}
}
if(flag) break;
}
if(!flag)
{
for(int j=1;j<=100&&p>0;j++)
{
if(seat[j]==0)
{
cout << j << " ";
seat[j]=1;
group[j/5]--;
p--;
}
}
}
cout << endl;
}
return 0;
}
543

被折叠的 条评论
为什么被折叠?



