题目链接.
算法思想
使用线性表,这里用数组,因为第一次要判断同一排的座位,所以另外设置一个数组place
来记录每一排剩余的座位数,这样就不需要遍历每一个座位即可得到结果。第二次判断得从头遍历,找到所需要的数量即可。
#include<iostream>
using namespace std;
//数组
int chair[21][6] = {};//座位编号,0 代表售出
int place[21] = {}; //每一排剩余座位数
int n, p, ticket = 0; //ticket 出票数
bool done = false; //出售成功
int main()
{
int i, j, k;
for ( i = 1; i <= 20; i++)
{
place[i] = 5;
for ( j = 1; j <= 5; j++)
{
chair[i][j] = (i - 1) * 5 + j;
}
}
scanf("%d", &n);
for ( k = 1; k <= n; k++)
{
scanf("%d", &p);
done = false;
for ( i = 1; i <= 20; i++)
{
if (p <= place[i])
{
for ( j = 1; j <= p; j++)
{
printf("%d ", chair[i][5 - place[i] + j]);
//chair[i][j] = 0;
}
place[i] -= p;
done = true;
break;
}
}
if (!done) //没有连续的票
{
ticket = 0;
for (i = 1; i <= 20 && ticket < p; i++)
{
for (j = 6 - place[i]; j <= 5 && ticket < p; j++)
{
printf("%d ", chair[i][j]);
place[i]--;
ticket++;
}
}
}
printf("\n");
}
return 0;
}
结果分析
得分100分,用时0ms,空间使用2.937MB,时间复杂度 O©。