CCF认证 20160902 火车购票

在这里插入图片描述
定义一个长度为20的一维数组a 表示每排剩余的座位数量,那么第 i 排剩余座位的起始编号就应该是i*5+6-a[i]。每次给定一个购票数量x,就遍历数组a查找有无剩余座位数量大于等于x的元素,有则从起始编号输出x个递增的数字,若没有则从有剩余座位的每一排中输出其所有剩余座位直至输出座位总数为x。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 20;
int a[maxn];//每排剩余座位数
int main() {
	int n;cin>>n;
	//memset(a,5,sizeof(a));//不能用它将int数组初始化为0和-1之外的其他值
	for(int i=0;i<maxn;i++)	a[i]=5;
	while(n--){
		int x;cin>>x;
		int i=0;
		while(i<20&&a[i]<x)++i;//查找是否有剩余座位数多于x的排
		if(i<20){//有,从该排起始编号开始输出k个连续递增数字
			int start=i*5+6-a[i];//计算座位标号
			for(int j=0;j<x;j++)
				cout<<start+j<<' ';
			a[i]-=x;//更新剩余座位数
		}
		else{//没有,从有剩余座位的排中输出空闲座位直至输出空余座位总数为x
			for(int j=0;j<20&&x>0;++j)
				if(a[j]){//有剩余座位
					int start=j*5+6-a[j];
					for(int k=0;k<min(a[j],x);++k)
						cout<<start+k<<' ';
					a[j]=x>a[j]?0:a[j]-x;//更新座位数
					x-=a[j];//更新剩余要选座位数
				}
		}
		cout<<endl;
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值