記事のディレクトリ
トピックリンク 。
アルゴリズムのアイデア
ここでは線形テーブルを使用して配列を使用します。同じ行の座席が初めて判断されるため、place
各行の残りの座席数を記録するために追加の配列が設定されているため、必要ありません。結果を得るために各座席を横断します。2番目の判断では、最初からトラバースして、必要な数量を見つける必要があります。
#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ポイント、時間は0ミリ秒、スペースは2.937MB、時間計算量はO©です。