CSP 201609-2 火车购票 模拟

本文提供了一种解决CSP201609-2火车购票模拟问题的方法,通过使用C++实现,程序能够处理乘客购票请求,并确保座位分配的合理性。首先尝试为乘客分配连续座位,若无法实现,则寻找空闲座位进行分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CSP 201609-2 火车购票 模拟

#include<iostream>
using namespace std;
#include<cstring>

int n;

int tic[105]; //存取每次购票指令

int vis[25][8]; //是否该座位已经被购买

int main()
{
	cin>>n;
	memset(vis,0,sizeof(vis));
	
	for(int i=0;i<n;i++)
		scanf("%d",&tic[i]);
		
	int ok; 
	
	for(int i=0;i<n;i++)
	{
		int tt=tic[i];
		
		for(int row=1;row<=20;row++) //枚举所有行,找到一行满足条件则跳出循环
		{
			 ok=0;
			for(int k=1;k<=5;k++) //枚举所有开始列,找到满足条件就跳出循环
			{
				ok=1;
				
				for(int j=k;j<=k+tt-1;j++)
				{
					if(j>5)
					{
						ok=0;
						break;
					}
					
					if(vis[row][j])
					{
						ok=0;
						break;
					}
				}
	
				
				if(ok)
				{
					
					for(int m=k;m<=k+tt-1;m++)
					{
						vis[row][m]=1;
						
						printf("%d ",(row-1)*5+m);
						
					}
					cout<<endl;
					break;
				}
				
			}
			
			if(ok)
				break;
			
		}		
		
		
		if(!ok)  //如果不能都连坐,按照编号抽空插入
		{
			int cnt=0;
			for(int m=1;m<=20;m++)
			{
				int yes=1;
				
				for(int n=1;n<=5;n++)
				{
					if(!vis[m][n])
					{
						cnt++;
						vis[m][n]=1;
						printf("%d ",(m-1)*5+n);
						
						if(cnt==tt)
						{
							printf("\n");
							yes=0;
							break;
						}
					}
										
				}
				
				if(!yes)
					break;
			}
			
		}
		
	}
	
		
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值