ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CCF-CSP-201609-2-火车购票

2021-08-06 23:07:11  阅读:247  来源: 互联网

标签:include 20 int 购票 ++ 201609 座位 CCF CSP


问题描述
  请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
  假设一节车厢有20排、每一排5个座位。为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号。
  购票时,一个人可能购一张或多张票,最多不超过5张。如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
  假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令。
输入格式
  输入的第一行包含一个整数n,表示购票指令的数量。
  第二行包含n个整数,每个整数p在1到5之间,表示要购入的票数,相邻的两个数之间使用一个空格分隔。
输出格式
  输出n行,每行对应一条指令的处理结果。
  对于购票指令p,输出p张车票的编号,按从小到大排序。
样例输入
4
2 5 4 2
样例输出
1 2
6 7 8 9 10
11 12 13 14
3 4
样例说明
  1) 购2张票,得到座位1、2。
  2) 购5张票,得到座位6至10。
  3) 购4张票,得到座位11至14。
  4) 购2张票,得到座位3、4。
评测用例规模与约定
  对于所有评测用例,1 ≤ n ≤ 100,所有购票数量之和不超过100。

分析
1.题目中第2行的每一个输入都<=5,说明每个人的购票数量<=5张;
2.首先需要考虑每一排是否存在空余座位能够容纳当前需要分配的人数,且尽可能同一排座位相邻,实在没有合适的位置才需要不相邻。
3.需要注意,当可以分配座位时,需要更新剩余座位或者是此时剩余人数。

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stack>
#include <cstring>
#include <math.h>
#define MAX 1100
using namespace std;
// struct Node
// {
//     int w, y;
//     char t;
// } node[MAX];
// struct line
// {
//     int x1, x2, x3;
// } l[20];

int main()
{
    int n;
    cin >> n;
    int a[100];
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    int seats[20][6];
    for (int i = 0; i < 20; i++)
    {
        seats[i][0] = 5; //初始化每一排的剩余座位
    }
    for (int i = 0; i < n; i++)
    {
        bool success = false;
        // int x = a[i];
        for (int j = 0; j < 20; j++)
        {
            int s = seats[j][0];//记录空闲位置
            if (s >= a[i])//空闲位置刚好能够分配
            {
                int start = 5 - s + 1; //开始坐的位置
                seats[i][0] -= a[i];   //从剩余的位置中减去分配的位置
                success = true;        //成功分配
                for (int k = start; k < start + a[i]; k++)
                {
                    int y = j * 5 + k; //记录分配的位置
                    cout << y << " ";  //将位置输出
                }
                cout << endl;
                break;
            }
        }
        if (!success) //没有成功分配
        {
            for (int j = 0; j < 20; j++)
            {
                int s = seats[j][0];
                while (s > 0 && a[i] > 0) //存在空位且人数尚未分配完成
                {
                    int y = j * 5 + 5 - s + 1; //记录分配的位置
                    cout << y << " ";          //将位置输出
                    s -= 1;                    //减少一个位置;
                    a[i] -= 1;                    //人数减少一位
                    seats[i][0] = s;           //更新空余位置
                }
                if (a[i] == 0)//一旦人员分配完成即退出
                {
                    break;
                }
            }
            cout << endl;
        }
        else
        {
            continue;
        }
    }
}

标签:include,20,int,购票,++,201609,座位,CCF,CSP
来源: https://blog.csdn.net/Azure_qwq/article/details/119464878

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有