201609-2 火车购票

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;
}

题目链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值