思路
- 两个数组 next 和 sale,next[i] 表示买 i 张票,如果连续出票,将从next[i] 排出票,sale[i] 表示第 i 排已经卖出了sale[i] 张票
- 买num张票的时候,从next[num] 排出票,根据next、sale数组可以计算出num张连续的票序号,同时该排的sale 数组值增加num
- update(row) 函数:如果从 row 排出票,next 值等于 row 的票可能要排到 row 后面,因为 row 排剩余票数可能不够
- 如果 next 等于21,说明已经不能提供连续的票了,只能从头开始一个一个找空隙出票
代码
#include<iostream>
#include<cstdio>
using namespace std;
int next[10];
int sale[25];
void update(int row)
{
for(int i = 1; i <= 5; ++i)
{
if(next[i] == row && 5 - sale[row] < i)
{
for(int j = row + 1; j <= 21; ++j)
{
if(5 - sale[j] >= i)
{
next[i] = j;
break;
}
}
}
}
}
int main()
{
int n, num;
cin >> n;
for(int i = 1; i <= 5; ++i)
next[i] = 1;
for(int i = 1; i <= 20; ++i)
sale[i] = 0;
while(n--)
{
scanf("%d", &num);
int row = next[num];
if(row > 20)
{
while(num--)
{
for(int i = 1; i <= 20; ++i)
{
if(sale[i] < 5)
{
sale[i]++;
printf("%d ", 5 * (i - 1) + sale[i]);
update(i);
break;
}
}
}
cout << endl;
}
else
{
for(int i = 1; i <= num; ++i)
printf("%d ", 5 * (row - 1) + sale[row] + i);
cout << endl;
sale[row] += num;
update(row);
}
}
return 0;
}