占座位

来源:互联网 发布:剑三脸型数据非法 编辑:程序博客网 时间: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命令也是无效的。

输出

对每个in命令输出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;}}}} } 


原创粉丝点击