|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
http://ac.jobdu.com/problem.php?pid=1334
这是题目,大致就是n * n个座位,一个人去占座,占过释放前不能再占,必须占连续的座位,
这是我写的代码,我自己运行感觉挺对的,但是一直都是wa。求帮助!!!
- #include <stdio.h>
- #include <string.h>
- int no[10002][2];//mark[i][0],mark[i][1]表示i编号同学占座的起始号和结束号
- bool mark[10002];//标记座位是否被占
- char op[2][5] =
- {
- "in",
- "out"
- };
- char str[5];
- int main()
- {
- int n,m;
- while(scanf("%d%d",&n,&m) != EOF)
- {//n * n个座位,m个人
- for(int i = 0; i < n * n; i++)
- {
- no[i][0] = 0;
- no[i][1] = 0;
- mark[i] = false;
- }
- int id,num;//学生编号和要占的座位数
- int k;
- int count = n * n;//表示可用的座位
- scanf("%d",&k);//k条指令
- for (int i1 = 0; i1 < k; i1++)
- {//k条指令
- bool ans = false;//命令有效初始为否
- scanf("%s",str);
- if(strcmp(op[0],str) == 0)
- {//命令为占座
- scanf("%d %d",&id,&num);
- if(no[id][0] == 0 && no[id][1] == 0 && num <= count)
- {//未申请过,可以申请
- for(int i = 0; i < n * n; i++)
- {//遍历座位
- int j = 0;
- while(mark[i + j] == false && i + j < n * n)
- {//找到第一个未被占的座位
- j++;
- if(j == num)
- {//找到
- count = count - num;
- no[id][0] = i;
- no[id][1] = i + num - 1;//标记占座的起始地址和结束地址
- for(int j = 0; j < num;j++)
- {
- mark[i + j] = true;//标记为已占座
- }
- ans = true;
- break;
- }
- }
- if(ans)
- {//找到,跳出循环
- break;
- }
- }
- }
- if(ans)
- {
- printf("yes\n") ;
- }
- else
- {
- printf("no\n");
- }
- }
- if(strcmp(op[1],str) == 0)
- {//释放座位
- scanf("%d",&id);
- if(no[id][0] != 0 || no[id][1] != 0)
- {//之前占座了
- for(int i = no[id][0]; i <= no[id][1]; i++)
- {
- mark[i] = false;//标记为未占座
- }
- count = no[id][1] - no[id][0] + 1 + count;
- no[id][0] = 0;
- no[id][1] = 0;
- }
- }
- }
- }
- return 0;
- }
复制代码
先说我没搞好 
不过看了你的思路,是不是因为输入格式不对。按你的思路在输入in 和 out 之后,要进行判断在进行输入那样需要一个回车的吧。如果oj 是 in 1 7 中间是空格输入是不是 oj判断就是错的了。我觉得换个方式比较好 这一条指令作为一个字符串数组, 在判断in out 进行后续操作
|
|