问题描述
  请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
  假设一节车厢有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。
 
解题思路:首先是要分两种情况来讨论:第一种是还存在某一行的座位数量够分配给购票的人,一种是当前行不够分,需要继续查找下一行。
第一种情况的话就很简单,只需要查找剩余的座位大于购票人的需求的行,计算出开始位置结束位置就可以输出座位号了。
第二种情况就是每一行都不够当前购票者的需求,那么就需要多行来分配了,首先从最开始的行来寻找,有空座位就把空座位分配,如果给购票者的座位分配够了就结束循环,不够的话继续查找下一行。
 
我是用到一个长度为20的数组来存储每排省多少座位的,大家可以自己选择顺手的容器来存储。
 
一个小测试技巧就是debug的时候可以把行数改小一点来测试第二种情况:
我的一个小测试案例,将行数改为3行,然后debug,可以看到哪块有问题。

4
3 5 4 3

#include<iostream>

using namespace std;
int a[20];
int main() {
//初始化座位
for (int i = 0; i < 20; i++) a[i] = 5;
int n;
cin >> n;
int num;
int start, end;//售出座位的开始位置和结束位置
for (int i = 0; i < n; i++) {
cin >> num;
for (int j = 0; j < 20; j++) {
if (a[j] >= num) {
//当前行够分配
start = j * 5 + (5 - a[j] + 1);
end = start + num - 1;
//输出结果
for (int k = start; k <= end; k++) {
if (k != start) cout << " ";
cout << k;
}
cout << endl;
a[j] -= num;
num = 0;//已经全部分配完成
break;
}
}
//一排不够分的情况
while (num > 0) {
for (int j = 0; j < 20; j++) {
if (a[j] >= num) {
//当前行够分配
start = j * 5 + (5 - a[j] + 1);
end = start + num - 1;
//输出结果
for (int k = start; k <= end; k++) {
if (k != start) cout << " ";
cout << k;
}
cout << endl;
a[j] -= num;
num = 0;//已经全部分配完成
break;
}
else {
//当前行不够分
//把当前行全部分配之后再继续查找下一行
if (a[j] > 0) {
//当前行有剩余的座位,,当前行如果没有空着的座位的话则不能分配
start = j * 5 + (5 - a[j] + 1);
end = start + a[j] - 1;
for (int k = start; k <= end; k++) {
cout << k<<" ";
}
}
num -= a[j];//当前购票人还差几张票,如果全部分配完,那么num=0
}
}
}
}
system("pause");
return 0;
}

CCF201609-2火车购票的更多相关文章

  1. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

  2. CCF201609-2 火车购票 java(100分)

    试题编号: 201609-2 试题名称: 火车购票 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一 ...

  3. CCF 2016-09-2 火车购票

    CCF 2016-09-2 火车购票 题目 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排5个座位.为方便起见,我们用1到100来给所有的 ...

  4. 火车购票问题(16年ccf)

    火车购票问题(16年ccf) 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排5个座位.为方便起见,我们用1到100来给所有的座位编号,第一 ...

  5. 【刷题笔记】火车购票-----java方案

    问题描述请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排5个座位.为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号 ...

  6. CCF 201612-2 火车购票 (暴力)

    问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排5个座位.为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10 ...

  7. ccf 火车购票

    import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main2 { pu ...

  8. CCF2016092火车购票

    问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排5个座位.为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10 ...

  9. CSP201609-2:火车购票

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  10. ccf-201609-2 火车购票

    问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排5个座位.为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10 ...

随机推荐

  1. Scipy和Numpy的插值对比

    技术背景 插值法在图像处理和信号处理.科学计算等领域中是非常常用的一项技术.不同的插值函数,可以根据给定的数据点构造出来一系列的分段函数.这一点有别于函数拟合,函数拟合一般是指用一个给定形式的连续函数 ...

  2. php 和微信小程序 解构赋值

    php 解构赋值只能解构索引数组 js:

  3. 循环输出 一个li里边两个图片循环

    <ul> <li><img src="123454"/><img src="123454"/></li&g ...

  4. 支持向量机(SVM):用一条线分开红豆与绿豆

    算法原理 要找到一些线,这些线都可以分割红豆和绿豆,找到正确的方向或者斜率的那条线,确认马路的宽度,得到最优解--马路的中轴 超平面:在三维空间中,平面是两个点距离相同的点的轨迹.一个平面没有厚度,而 ...

  5. 聊聊视频中的编解码器,你所不知道的h264、h265、vp8、vp9和av1编解码库

    你知道FFmpeg吗?了解过h264/h265/vp8/vp9编解码库吗? 我们日常生活中使用最广泛的五种视频编码:H264(AVC).H265(HEVC).vp8.vp9.av1都分别是什么?由哪些 ...

  6. 防止入侵 两步修改XP远程管理默认端口

    自Windows 2000开始,微软就提供一项终端服务(Terminal Server)这项服务可以将远程的桌面传递到本地.通过该服务,可视化的远程管理可以非常方便的实现.继Windows 2000之 ...

  7. 6月15日 python学习总结 Django模板语言相关内容

    Django模板语言相关内容   Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...

  8. Redis运维实战之集群中的脑裂

    1.对于分布式Redis主从集群来说,什么是脑裂? 所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求.而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客 ...

  9. 基于JDK的动态代理原理分析

    基于JDK的动态代理原理分析 这篇文章解决三个问题: What 动态代理是什么 How 动态代理怎么用 Why 动态代理的原理 动态代理是什么? 动态代理是代理模式的一种具体实现,是指在程序运行期间, ...

  10. 网络编程-Python的socket库

    一.网络连接经常用到的函数 sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)参数一:地址簇 socket.AF_INET IPv4(默认) ...