马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 进行后续操作
|