题目描述
火车票务系统需要处理订单,按照特定规则分配座位。系统需要支持查询余票和订购操作。
算法思路
使用数组模拟座位状态:
- 用二维数组记录每节车厢每个座位的状态(已售/未售)
- 订购时按车厢顺序查找能满足连座需求的座位
- 连座要求可能分布在不同车厢
代码实现
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);cin.tie(nullptr);
int n, m;
cin >> n >> m;
// 每节车厢5个座位,共n节车厢
vector<vector<int>> seat(n, vector<int>(5, 0)); // 0表示未售
for(int i = 0; i < m; i++){
int k;
cin >> k;
bool sold = false;
// 尝试在单节车厢内找连续k个座位
for(int j = 0; j < n && !sold; j++){
for(int s = 0; s + k <= 5 && !sold; s++){
bool ok = true;
for(int t = 0; t < k; t++){
if(seat[j][s + t] == 1){
ok = false;
break;
}
}
if(ok){
// 找到,标记为已售
for(int t = 0; t < k; t++){
seat[j][s + t] = 1;
}
cout << j + 1 << "-" << s + 1 << "-" << s + k << endl;
sold = true;
}
}
}
// 如果单节车厢不够,尝试跨车厢
if(!sold){
// 收集所有未售座位
vector<pair<int,int>> available;
for(int j = 0; j < n; j++){
for(int s = 0; s < 5; s++){
if(seat[j][s] == 0){
available.push_back({j, s});
}
}
}
if((int)available.size() >= k){
// 找到k个连续座位(可能跨车厢)
cout << available[0].first + 1 << "-" << available[0].second + 1;
for(int t = 1; t < k; t++){
cout << " " << available[t].first + 1 << "-" << available[t].second + 1;
}
cout << endl;
for(int t = 0; t < k; t++){
seat[available[t].first][available[t].second] = 1;
}
sold = true;
}
}
if(!sold){
cout << "false" << endl;
}
}
return 0;
}关键点
- 优先在单节车厢内查找连续座位
- 如果单节车厢不够,跨车厢分配
- 使用二维数组模拟座位状态
参考
- CCF-CSP认证