问题 : 占座位
时间限制: 1 Sec 内存限制: 128 MB
提交: 324 解决: 120
[提交][状态][讨论版]
题目描述
sun所在学校的教室座位每天都是可以预占的。
一个人可以去占多个座位,而且一定是要连续的座位,如果占不到他所要求的这么多座位,那么他就一个座位也不要了。为了降低难度,每次分配座位按座位号从小到大查找,采用最先适配法分配座位。
输入
输入有多组数据。
每组数据输入座位排数n,0
#include<iostream>
using namespace std;
struct place
{
int begin;
int end;
};
int main()
{
int n,m,k,id,num;
int in[101]={0},seat[10001]={0};
place a[101]; //用来记录id所占位置的起止
string order;
cin>>n>>m;
int cnt=n*n; //剩余座位数
cin>>k;
for(int i=0;i<k;i++)
{
cin>>order;
if(order=="in")
{
cin>>id>>num;
if(in[id]==0 && num<=cnt){
int j=0,flag=0;
for(int i=0;i<n*n;i++) //have a try
{
if(seat[i]==0){
j++;
if(j==num){
cnt-=num;
in[id]++,flag++;
a[id].end=i;a[id].begin=i-num;
cout<<"yes"<<endl;
break;
}
}else{
j=0;
}
}
if(flag==0){
cout<<"no"<<endl; //没有找到连续座位
}
}else{
cout<<"no"<<endl;
}
//输入out的情况
}else{
cin>>id;
if(in[id]!=0){
in[id]--;
cnt+=(a[id].end-a[id].begin);
for(int i=a[id].begin;i<=a[id].end;i++)
{
seat[i]=0;
}
}
}
}
return 0;
}