天天看點

CCF-201609-2-火車購票

試題編号: 201609-2

試題名稱: 火車購票

時間限制: 1.0s

記憶體限制: 256.0MB

問題描述:

  請實作一個鐵路購票系統的簡單座位配置設定算法,來處理一節車廂的座位配置設定。

  假設一節車廂有20排、每一排5個座位。為友善起見,我們用1到100來給所有的座位編号,第一排是1到5号,第二排是6到10号,依次類推,第20排是96到100号。

  購票時,一個人可能購一張或多張票,最多不超過5張。如果這幾張票可以安排在同一排編号相鄰的座位,則應該安排在編号最小的相鄰座位。否則應該安排在編号最小的幾個空座位中(不考慮是否相鄰)。

  假設初始時車票全部未被購買,現在給了一些購票指令,請你處理這些指令。

  

輸入格式

  輸入的第一行包含一個整數n,表示購票指令的數量。

  第二行包含n個整數,每個整數p在1到5之間,表示要購入的票數,相鄰的兩個數之間使用一個空格分隔。

  

輸出格式

  輸出n行,每行對應一條指令的處理結果。

  對于購票指令p,輸出p張車票的編号,按從小到大排序。

  

樣例輸入

4

2 5 4 2

樣例輸出

1 2

6 7 8 9 10

11 12 13 14

3 4

樣例說明

  1) 購2張票,得到座位1、2。

  2) 購5張票,得到座位6至10。

  3) 購4張票,得到座位11至14。

  4) 購2張票,得到座位3、4。

  

評測用例規模與約定

  對于所有評測用例,1 ≤ n ≤ 100,所有購票數量之和不超過100。

AC的C++代碼如下:

#include<iostream>
using namespace std;
const int N = 110;
int a[N];
int x, n, flag;

void complement()                             //當沒有連着的座位時,從1号開始有空位就配置設定座位
{
	for (int i = 1, cnt = 0; i <= 100; i++)
	{
		if (!a[i])
		{
			if (cnt == 0) cout << i;
			else cout << " " << i;
			a[i] = 1;
			cnt++;
			if (cnt == x) break;
		}
	}
	cout << endl;
} 
void find1()                                  //x=1的時候
{
	for (int i = 1; i <= 100; i++)
	{
		if (!a[i])
		{
			a[i] = 1;
			flag = 1;
			cout << i << endl;
			break;
		}
	}
}
void find2()                                  //x=2的時候
{
	for (int i = 1; i <= 99; i++)
	{
		if (i % 5 == 0)continue;
		else
		{
			if (a[i] == 0 && a[i + 1] == 0)
			{
				flag = 1;
				a[i] = a[i + 1] = 1;
				cout << i << " " << i + 1 << endl;
				break;
			}
		}
	}
}
void find3()                                  //x=3的時候
{
	for (int i = 1; i <= 98; i++)
	{
		if (i % 5 == 0 || i % 5 == 4) continue;
		else
		{
			if (a[i] == 0 && a[i + 1] == 0 && a[i + 2] == 0)
			{
				flag = 1;
				a[i] = a[i + 1] = a[i + 2] = 1;
				cout << i << " " << i + 1 << " " << i + 2 << endl;
				break;
			}
		}
	}
}
void find4()                                  //x=4的時候
{
	for (int i = 1; i <= 97; i++)
	{
		if (i % 5 == 0 || i % 5 == 4 || i % 5 == 3) continue;
		else
		{
			if (a[i] == 0 && a[i + 1] == 0 && a[i + 2] == 0 && a[i + 3] == 0)
			{
				flag = 1;
				a[i] = a[i + 1] = a[i + 2] = a[i + 3] = 1;
				cout << i << " " << i + 1 << " " << i + 2 << " " << i + 3 << endl;
				break;
			}
		}
	}
}
void find5()                                  //x=5的時候
{
	for (int i = 1; i <= 96; i++)
	{
		if (i % 5 == 1)
		{
			if (a[i] == 0 && a[i + 1] == 0 && a[i + 2] == 0 && a[i + 3] == 0 && a[i + 4] == 0)
			{
				flag = 1;
				a[i] = a[i + 1] = a[i + 2] = a[i + 3] = a[i + 4] = 1;
				cout << i << " " << i + 1 << " " << i + 2 << " " << i + 3 << " " << i + 4 << endl;
				break;
			}
		}
	}
}

int main()
{
	cin >> n;
	while (n--)
	{
		flag = 0;
		cin >> x;
		if (x == 1)
			find1();
		else if (x == 2)
		{
			find2();
			if (!flag) complement();
		}
		else if (x == 3)
		{
			find3();
			if (!flag) complement();
		}
		else if (x == 4)
		{
			find4();
			if (!flag) complement();
		}
		else if (x == 5)
		{
			find5();
			if (!flag) complement();
		}
	}
}