XDOJ-购票系统

XDOJ-购票系统

标题
购票系统

类别
综合

时间限制
1S

内存限制
256Kb

问题描述
请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
假设一节车厢有20排、每一排5个座位。为方便起见,
我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号。
  购票时,一个人可能购一张或多张票,最多不超过5张。
如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位
。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令,输出购票结果。
例如:若一次购买2,5,4,2张票得到的购票结果为:
1) 购2张票,得到座位1、2。
2) 购5张票,得到座位6至10。
3) 购4张票,得到座位11至14。
4) 购2张票,得到座位3、4。

输入说明
输入由两行构成。
第一行包含一个整数n,表示购票指令的数量,1 ≤ n ≤ 100。
第二行包含n个整数,每个整数p在1到5之间,表示要购入的票数,相邻的两个整数之间使用一个空格分隔,
所有购票数量之和不超过100。

输出说明
输出n行,每行对应一条购票指令的处理结果。即对于购票指令p,按从小到大排序输出p张车票的编号。

输入样例
4
2 5 4 2

输出样例
1 2
6 7 8 9 10
11 12 13 14
3 4

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
	int a[20][6] ,b[100],n,i,j,m=0,t=0,p,q;
	bool result = true;
	for (i = 0; i < 20; i++)//将20排座位,每个座位初值赋为0,a[i][5]来记录改排还有多少空位
	{
		a[i][5] = 5;
		for (j = 0; j < 5; j++)
		{
			a[i][j] = 0;
		}
	}
	cin >> n;
	for (i = 0; i < n; i++)//储存购票命令
	{
		cin >> b[i];
	}
	for (i = 0; i < n; i++)//开始购票分配座位
	{
		for (j = 0; j < 20; j++)
		{
			if (b[i] <= a[j][5])//此时为可以买到连续最小号,j+1即为符合要求的排数
			{
				result = false;//将result赋值为false
				break;
			}
		}
		if (result)//result初值为真,即未买到连续最小号,只能从小到大寻找空位
		{
			for (p = 0; p < 20; p++)
			{
				for (q = 0; q < 5; q++)
				{
					if (a[p][q] == 0)//已经将购票成功座位值赋为1,为0表示还没有被买到
					{
						a[p][q] = 1;
						cout << p * 5 + q + 1 << " ";//p*5+q+1即为座位号数
						t++;
						a[p][5]--;
					}
					if (t == b[i])
						break;
				}
				if (t == b[i])//两个break跳出两层循环
					break;
			}
			t = 0;//变量重置
			cout << endl;
		}
		else
		{
			for (m = 5 - a[j][5]; m < 5 - a[j][5] + b[i]; m++)//将购票成功的座位值赋为1,表示有人了
			{
				a[j][m] = 1;
				cout << j * 5 + m + 1 << " ";
			}
			a[j][5] -= b[i];//更新该排所剩空位
			cout << endl;
		}
		result = true;//变量重置
	}
	

	return 0;
}

个人认为编程一定要有好习惯,不然很有可能出事,比如此篇中变量用完重置
ps:如有错误敬请指正,如有问题欢迎评论区讨论或私信
邮箱:1654407501@qq.com如果对你有用的话,请点赞并关注,近期不定时更新新内容

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怡人蝶梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值