首页 > 代码库 > 九度OJ 1334 占座位 (模拟 细心)
九度OJ 1334 占座位 (模拟 细心)
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:737
解决:174
- 题目描述:
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
#include<iostream> #include<string.h> #include<stdio.h> 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; }
九度OJ 1334 占座位 (模拟 细心)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。