時間限制:1 秒
內存限制:32 兆
特殊判題:否
提交:737
解決:174
sun所在學校的教室座位每天都是可以預占的。
一個人可以去占多個座位,而且一定是要連續的座位,如果占不到他所要求的這麼多座位,那麼他就一個座位也不要了。為了降低難度,每次分配座位按座位號從小到大查找,采用最先適配法分配座位。
輸入有多組數據。
每組數據輸入座位排數n,0
1.in id num(代表id,0<=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做本題要細心細心,再細心。AC代碼 60ms
#include#include #include using namespace std; typedef struct node{ int start; int end; }node; node c[101]; char a[10010]; char in[101]; char out[101]; char op[5]; int main(int argc, char *argv[]) { int n,m; int id; int k; //freopen("1334.in","r",stdin); while(~scanf("%d%d%d",&n,&m,&k)) { memset(c,0,sizeof(c)); memset(a,0,sizeof(a)); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); for(int i=1;i<=k;++i) { scanf("%s",op); if(strcmp(op,"in")==0) { int num; scanf("%d%d",&id,&num); if(in[id]==0)//沒參加過 { //have a try int cnt=0; int tt; int flag=0; for(tt=1;tt<=n*n;++tt) { if(a[tt]==0){ cnt++; if(cnt==num){ flag=1; printf("yes\n"); c[id].start=tt-num+1; c[id].end=tt; //printf("start %d end %d\n",c[id].start,c[id].end); in[id]=1;//標志參加了 out[id]=0; for(int k=c[id].start;k<=c[id].end;++k) a[k]=1;//占位置 break; } } else if(a[tt]==1) cnt=0; } if(!flag) printf("no\n"); } else { //已經參加過了 printf("no\n"); } } else { scanf("%d",&id); if(out[id]==0) { in[id]=0; out[id]=1; int s=c[id].start; int e=c[id].end; for(int i=s;i<=e;++i) a[i]=0; } } } } return 0; }