201609-2 火车购票
题意描述
依次输入购票的数量 输出购买票的编号
输入输出格式
输入 n 个数 依次为购票的数量 输出购得票的编号
数据规模
n
<= 1e2
算法设计
我们要设计一个简单的购票系统 就是模拟这个购票的流程。考虑到火车共有20排,每排有5个座位 故我们用vector<gg>train(20,5)
来维护信息 数组下标为排编号 从 0 开始 数组值为这排剩余座位数 而且题目中多次强调从小到大 而且 连续 所以 若从 i
排开始买票 第一张票的编号就是 i * 5 + 1 + 5 - train[i]
解决了这个问题 剩下的就是跟着题目要求走 若有整排能容纳 就分在整排 若不能 从前到后 依次遍历每排即可
c++11代码
#include <bits/stdc++.h>
using namespace std;
using gg = long long;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
vector<gg>train(20,5); // 20排 每一排均剩余 5 个座位
gg n,ins;
cin>>n;
while(n--){
cin>>ins;
auto j = find_if(train.begin(),train.end(),[&train,ins](gg a){
return a >= ins;
});
if(j == train.end()){
for(gg i = 0;i < 20;i++){
if(train[i] >= ins){
for(gg j = i * 5 + 1 + 5 - train[i], cont = ins;cont > 0;j++,cont--) cout<<j<<" ";
cout<<"\n";
train[i] -= ins;
break;
}else{
for(gg j = i * 5 + 1 + 5 - train[i];j <= (i + 1) * 5;j++) cout<<j<<" ";
ins -= train[i];
train[i] = 0;
}
}
}else{
gg pos = j - train.begin(); // 排号
for(gg i = pos * 5 + 1 + 5 - train[pos], cont = ins;cont > 0;i++,cont--) cout<<i<<" ";
cout<<"\n";
train[pos] -= ins;
}
}
return 0;
}