模擬
利用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;
}