占座位
来源:互联网 发布:剑三脸型数据非法 编辑:程序博客网 时间:2024/05/16 02:06
问题 : 占座位
时间限制: 1 Sec 内存限制: 128 MB
提交: 677 解决: 288
题目描述
sun所在学校的教室座位每天都是可以预占的。
一个人可以去占多个座位,而且一定是要连续的座位,如果占不到他所要求的这么多座位,那么他就一个座位也不要了。为了降低难度,每次分配座位按座位号从小到大查找,采用最先适配法分配座位。
一个人可以去占多个座位,而且一定是要连续的座位,如果占不到他所要求的这么多座位,那么他就一个座位也不要了。为了降低难度,每次分配座位按座位号从小到大查找,采用最先适配法分配座位。
输入
输入有多组数据。
每组数据输入座位排数n,0<n<=100(座位的排列数相等,座位是按每行从左到右依次排序的,,第1行的最右边一个座位与第二行的第一个座位视为连续座位),m( 0<m<=min(100,n*n) )个人。
然后输入k(0<k<=100),最后输入k个命令。
命令只有两种:
1.in id num(代表id,0<=id<m,要占num个座位,若占不到连续的num(0<num<=20)个座位表示该命令无效)
2.out id(代表id要释放他之前占的所有座位)
注意:如果id之前占过座还没释放那么之后他的in命令都是无效的,
如果id之前没占过座位那么他的out命令也是无效的。
每组数据输入座位排数n,0<n<=100(座位的排列数相等,座位是按每行从左到右依次排序的,,第1行的最右边一个座位与第二行的第一个座位视为连续座位),m( 0<m<=min(100,n*n) )个人。
然后输入k(0<k<=100),最后输入k个命令。
命令只有两种:
1.in id num(代表id,0<=id<m,要占num个座位,若占不到连续的num(0<num<=20)个座位表示该命令无效)
2.out id(代表id要释放他之前占的所有座位)
注意:如果id之前占过座还没释放那么之后他的in命令都是无效的,
如果id之前没占过座位那么他的out命令也是无效的。
输出
对每个in命令输出yes或者no,如果命令有效则输出yes,无效则输出no。
在yes no后面只带有回车,不带其他任何字符。
在yes no后面只带有回车,不带其他任何字符。
样例输入
4 109in 1 7in 2 3in 3 3in 3 3in 4 3out 2in 5 6out 3in 5 6
样例输出
yesyesyesnoyesnoyes
提示
理清思路
首先我们看一下题目究竟有什么要求:
1、对in操作进行占座位操作,如果可以占就输出yes,如果之前占了座位没释放或者不够连续座位占就输出no
实现:
统计能不能占足够的连续座位我觉得可以使用数组遍历,因为这里的座位每一行的结尾和下一行的开头视作连续座位,所以我们可以直接设一个一维数组来进行操作。
遍历的时候可以记录下当前已经有多少个可以用的座位,如果足够了就马上退出,如果遇到了不连续的情况,要把可以用的座位清0因为已经不连续了。(前面说的马上退出就是因为,如果你不退出,后面有可能遇到别人占的座位,然后能够占的座位数量清0,再统计就错了!因为题目为了简化,要从座位小的开始占)
然后我们应该从头开始遍历,这是因为我们之后有可能释放之前占的座位。
2、占座位其实就是简单的数组赋值
3、out操作不需要判断yes or no,所以直接清空就好了,占了程序就会清,没占也没发生什么。
代码展示
#include<iostream>#include<string>using namespace std;int seat[10000]={0};int main(){int row=0;//行数 while(cin>>row){for(int i=0;i<row*row;i++)//初始化 {seat[i]=0;}int m=0;//人数,但我觉得没用啊 cin>>m;int n=0;cin>>n;string s;//什么操作 in还是out int id=0;//是什么同学 int num=0;//要占多少个座位 int k=0; //记录究竟现在占到什么座位了 for(int i=0;i<n;i++){cin>>s;//cout<<s<<endl<<id<<endl<<num<<endl;if(s[0]=='i')//如果是in操作的话 {cin>>id;cin>>num;bool occupy=false;//首先判断是否已经占过座位了 for(int j=0;j<row*row;j++)//如果占了座位,后面的in就无效了 {if(seat[j]==id)//找到了占过座位的痕迹 {occupy=true;break;// * }}if(occupy==true)//这里我纯粹是真的想起到“continue ”的作用,因为在 *处加continue还是困在那个for循环 {cout<<"no"<<endl;continue;} bool enough=false;int seattotal=0;for(int j=0;j<row*row;j++)//检查是否够位子,要注意,你有可能释放前面占过的座位,所以要从头开始寻 {if(seat[j]==0){seattotal++;if(seattotal==num)//如果足够位置了,那么就直接break出去好了,用k记录当前位置,倒序占座位 {k=j;break;}}else//不连续,直接清零能够占的座位 {seattotal=0;} }if(seattotal==num)enough=true;if(enough==true){cout<<"yes"<<endl;for(int j=k;num>0;j--)//霸座位,数组内容为id ,这样子做就可以表示是这个人占的座位了 {seat[j]=id;num--;}}else{cout<<"no"<<endl;}}else//遇到了out操作不用判断是否有效,无效就无法清空嘛,有效的直接清空嘛,不需要输出yes or no {cin>>id;for(int j=0;j<row*row;j++)//占过就清空 {if(seat[j]==id)seat[j]=0;}}}} }
阅读全文
0 0
- 占座位
- 问题 : 占座位
- 问题:占座位
- 在公交车上如何占到座位?
- 九度 题目1334:占座位
- 九度OJ 1334 占座位 (模拟 细心)
- 九度OJ 1334:占座位 (模拟)
- 座位
- 占
- 占
- 占
- 占占
- 座位调整
- 排座位
- 座位调整
- 排座位
- 排座位
- MJ座位
- 67 个拯救前端开发者的工具、库和资源
- Ajax
- 论文画图颜色搭配
- 最大长方形(动态规划)
- 第一个SpringBoot项目
- 占座位
- React学习的记录
- PHP多文件上传类--upload.class.php
- CCF-201612-1-中间数
- Java去除文件中的重复行
- 继承与虚继承
- 使用map删除字符串的交集
- laravel的任务调度和linux的计划任务
- 一道面试题目引发的思考