CSP 201609-2 火車購票

模擬

利用list維護100個座位的刪除操作

c++ 代碼如下:

 

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <list>
using namespace std;

const int maxn = 1005;
int a[maxn]; // 購票
int n;

list<int> empty_seat; // 空座位鏈表

struct seats // 共20排,每排5個座位
{
	int full_seat; // default = 0
	int connect_num; // 連坐數目
	int is_used[6]; // is_used[1], is_used[2], ..., is_used[5]
};
seats line[25];

void solve(int num);

int main()
{
	int n;
	while (cin >> n){
		memset(a, 0, sizeof(a));
		for (int i = 1; i <= n; i++){
			cin >> a[i]; // n位乘客的購票數
			// 對於購票指令p,輸出p張車票的編號,按從小到大排序。
		}
		memset(line, 0, sizeof(line));
		for (int i = 1; i <= 20; i++){
			line[i].full_seat = 0;
			line[i].connect_num = 5;
			for (int j = 0; j < 6; j++){
				line[i].is_used[j] = 0; // 沒被用到
			}
		}

		// 初始化空座位列表
		for (int i = 1; i <= 100; i++){
			empty_seat.push_back(i);
		}

		for (int i = 1; i <= n; i++){
			solve(a[i]);
		}
	}
	return 0;
}

void solve(int num){
	int maxi = 1;
	int flag = 0;
	for (int i = 1; i <= 20; i++)
	{
		if (line[i].connect_num >= num){
			maxi = i;
			flag = 1;
			break;
		}
	}
	
	if (flag == 0) // 小於購票數
	{
		for (int i = 0; i < num; i++)
		{
			for (auto it = empty_seat.begin(); it != empty_seat.end(); it++)
			{
				int id = *it;
				cout << id << " ";
				// 計算第id個座位對應的行號
				int row;
				if (id % 5 == 0) row = id / 5;
				else row = (id / 5) + 1;
				// 計算第id個座位對應的列號 
				int col = id - (row - 1) * 5;
				line[row].full_seat++;
				line[row].connect_num--;
				line[row].is_used[col] = 1;
				empty_seat.erase(it);
			}
		}
	}

	else
	{
		int first = 1;
		for (int i = 1; i <= 5; i++){
			if (line[maxi].is_used[i] == 0){
				first = i;
				break;
			}
		}
		for (int i = 0; i < num; i++){
			line[maxi].full_seat++;
			line[maxi].connect_num--;
			line[maxi].is_used[i + first] = 1;
			// 從空閒列表中刪除掉該座位
			for (auto it = empty_seat.begin(); it != empty_seat.end(); it++){
				if (*it == (maxi - 1) * 5 + first + i) {
					cout << *it << " ";
					empty_seat.erase(it);
					break;
				}
			}
		}
	}

	cout << endl;
}

 

發佈了70 篇原創文章 · 獲贊 81 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章