CCF/CSP_201609-2_火车购票

问题描述

在这里插入图片描述

思路

由于始终都是编号较小的座位优先被使用,因此不会出现下图这种间隔的情况

00100

也即座位只会是这样的:

11100

因此

case1:可以安排相邻座位
只需要判断在该行中是否有空座的数量 == 某人购票数量就可以了
若满足该条件,则依次将该座位标志置为1(表示该座位有人了),并输出对应的座位号

case2:没有相邻座位可以安排
当100个座位遍历完毕使,仍有某行空座的数量 != 某人购票数量,说明只能安排较小编号的座位见缝插针买票
此时只需要从头遍历,选取seat[ j ] == 0的座位售卖。

完整代码

#include<iostream>
using namespace std;

int seat[101] = {0};

int main(){
    int n;
    cin >> n;

    int a[n];
    for( int i = 0; i < n; i++)
        cin >> a[i];

    int sum = 0;
    for( int i = 0; i < n; i++){
        for( int j = 0; j < 100; j++){
            if( j%5 == 0)
                sum = 0;
            if( seat[j] == 0)
                sum++;
            if( sum == a[i]){   //可以连坐
                j = j - sum + 1;
                for( int counter = sum; counter > 0; counter--)
                {
                    seat[j] = 1;
                    cout << j + 1 << ' ';
                    j++;
                }
                cout << endl;
                break;
            }
        }
        if( sum != a[i]){    //没有连坐
            for( int j = 0; j < 100; j++){
                if( seat[j] == 0 && a[i] > 0){
                    seat[j] = 1;
                    cout << j+1 << ' ';
                    a[i]--;
                }
                if( a[i] == 0)
                    break;
            }
            cout << endl;
        }
    }

    return 0;
}

提交截图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值