-
题目描述:
-
sun所在学校的教室座位每天都是可以预占的。
一个人可以去占多个座位,而且一定是要连续的座位,如果占不到他所要求的这么多座位,那么他就一个座位也不要了。为了降低难度,每次分配座位按座位号从小到大查找,采用最先适配法分配座位。
-
输入:
-
输入有多组数据。
每组数据输入座位排数n,0<n<=100(座位的排列数相等,座位是按每行从左到右依次排序的),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 10 9 in 1 7 in 2 3 in 3 3 in 3 3 in 4 3 out 2 in 5 6 out 3 in 5 6
-
样例输出:
-
yes yes yes no yes no
yes
-
-
///
-
这个做个模拟就可以了,这里用v[j][i]表示第j行i列的座位是否被占用,首先分清命令in和out,其次判断命令是否有效。
-
-
占座位分为两步:1.找出连续的座位;2.填满座位
-
上代码:
-
-
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<string> #include<string.h> using namespace std; bool v[101][101]; int in[101][3]; int n,m,k,olen; bool find(int wn,int&v1,int &v2) { int j,i; int temp=0;//表示连续的座位有几个 for(j=0;j<n;j++) { for(i=0;i<n;i++) { if(!v[j][i]) { if(temp==0)//每次记录开始的座位 { v1=j; v2=i; } temp++; } else temp=0; if(temp==wn)//连续座位达到目标,跳出循环 break; } if(temp==wn) break; } if(temp==wn) return true;//表示已经找到那么多连续座位 else return false; } bool fill(int v1,int v2,int tw)//这个就是找到后给满足条件的座位占位 { int j,i; for(j=v1;j<n;j++) { if(v1==j) i=v2; else i=0; for(;i<n;i++) if(tw==0) break; else { v[j][i]=true; tw--; } if(tw==0) break; } if(tw==0) return true; else return false; } bool clean(int v1,int v2,int tw)//out操作,简单 { int j,i; for(j=v1;j<n;j++) { if(v1==j) i=v2; else i=0; for(;i<n;i++) if(tw==0) break; else { v[j][i]=false; tw--; } if(tw==0) break; } if(tw==0) return true; else return false; } int main() { int j,i,id,wn,v1,v2; string order; while(cin>>n>>m>>k) { olen=0; memset(v,0,sizeof(v)); memset(in,0,sizeof(in)); for(j=0;j<k;j++) { cin>>order; if(order=="in") { cin>>id>>wn; if(in[id][2]==0) { if(find(wn,v1,v2))//v1和v2记录符合条件的座位串的开始座位 { cout<<"yes"<<endl; fill(v1,v2,wn); in[id][0]=v1; in[id][1]=v2; in[id][2]=wn; } else//没找到连续座位就输出no cout<<"no"<<endl; } else cout<<"no"<<endl; } else if(order=="out") { cin>>id; if(in[id][2]==0) ;//cout<<"no"<<endl; else { //cout<<"yes"<<endl; clean(in[id][0],in[id][1],in[id][2]); in[id][2]=0; } } } } return 0; } /************************************************************** Problem: 1334 User: 午夜小白龙 Language: C++ Result: Accepted Time:80 ms Memory:1528 kb ****************************************************************/