鱼C论坛

 找回密码
 立即注册
查看: 1582|回复: 4

[已解决]九度1334 一直wa

[复制链接]
发表于 2017-2-23 21:42:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
http://ac.jobdu.com/problem.php?pid=1334
这是题目,大致就是n * n个座位,一个人去占座,占过释放前不能再占,必须占连续的座位,
这是我写的代码,我自己运行感觉挺对的,但是一直都是wa。求帮助!!!
  1. #include <stdio.h>
  2. #include <string.h>

  3. int no[10002][2];//mark[i][0],mark[i][1]表示i编号同学占座的起始号和结束号
  4. bool mark[10002];//标记座位是否被占
  5. char op[2][5] =
  6. {
  7.         "in",
  8.         "out"
  9. };
  10. char str[5];
  11. int main()
  12. {
  13.         int n,m;
  14.         while(scanf("%d%d",&n,&m) != EOF)
  15.         {//n * n个座位,m个人
  16.                 for(int i = 0; i < n * n; i++)
  17.                 {
  18.                         no[i][0] = 0;
  19.                         no[i][1] = 0;
  20.                         mark[i] = false;
  21.                 }
  22.                 int id,num;//学生编号和要占的座位数
  23.                 int k;
  24.                 int count = n * n;//表示可用的座位
  25.                 scanf("%d",&k);//k条指令
  26.                 for (int i1 = 0; i1 < k; i1++)
  27.                 {//k条指令
  28.                         bool ans = false;//命令有效初始为否
  29.                         scanf("%s",str);
  30.                         if(strcmp(op[0],str) == 0)
  31.                         {//命令为占座
  32.                                 scanf("%d %d",&id,&num);
  33.                                 if(no[id][0] == 0 && no[id][1] == 0 && num <= count)
  34.                                 {//未申请过,可以申请
  35.                                         for(int i = 0; i < n * n; i++)
  36.                                         {//遍历座位
  37.                                                 int j = 0;
  38.                                                 while(mark[i + j] == false && i + j < n * n)
  39.                                                 {//找到第一个未被占的座位
  40.                                                         j++;
  41.                                                         if(j == num)
  42.                                                         {//找到
  43.                                                                 count = count - num;
  44.                                                                 no[id][0] = i;
  45.                                                                 no[id][1] = i + num - 1;//标记占座的起始地址和结束地址
  46.                                                                 for(int j = 0; j < num;j++)
  47.                                                                 {
  48.                                                                         mark[i + j] = true;//标记为已占座
  49.                                                                 }
  50.                                                                 ans = true;
  51.                                                                 break;
  52.                                                         }
  53.                                                 }
  54.                                                 if(ans)
  55.                                                 {//找到,跳出循环
  56.                                                         break;
  57.                                                 }
  58.                                         }
  59.                                 }
  60.                                 if(ans)
  61.                                 {
  62.                                         printf("yes\n")        ;
  63.                                 }
  64.                                 else
  65.                                 {
  66.                                         printf("no\n");
  67.                                 }
  68.                         }
  69.                         if(strcmp(op[1],str) == 0)
  70.                         {//释放座位
  71.                                 scanf("%d",&id);
  72.                                 if(no[id][0] != 0 || no[id][1] != 0)
  73.                                 {//之前占座了
  74.                                         for(int i = no[id][0]; i <= no[id][1]; i++)
  75.                                         {
  76.                                                 mark[i] = false;//标记为未占座
  77.                                         }
  78.                                         count = no[id][1] - no[id][0] + 1 + count;
  79.                                         no[id][0] = 0;
  80.                                         no[id][1] = 0;
  81.                                 }
  82.                         }
  83.                 }
  84.         }
  85.         return 0;
  86. }
复制代码
最佳答案
2017-3-7 15:14:22
先说我没搞好
不过看了你的思路,是不是因为输入格式不对。按你的思路在输入in 和 out 之后,要进行判断在进行输入那样需要一个回车的吧。如果oj 是 in 1 7 中间是空格输入是不是 oj判断就是错的了。我觉得换个方式比较好 这一条指令作为一个字符串数组, 在判断in out 进行后续操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-7 00:41:03 | 显示全部楼层
具体实现还在看 但发现一个错误
scanf("%d%d",&n,&m) 这一句这样怎么输入数字呢 两个%d中间没有间隔或者符号,你输入123的话你是想表达第一个数字是1还是12还是123呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 11:54:07 | 显示全部楼层
lumber2388779 发表于 2017-3-7 00:41
具体实现还在看 但发现一个错误
scanf("%d%d",&n,&m) 这一句这样怎么输入数字呢 两个%d中间没有间隔或者 ...

还没看题,不过这样的表达方式,空格和回车是都可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 15:14:22 | 显示全部楼层    本楼为最佳答案   
先说我没搞好
不过看了你的思路,是不是因为输入格式不对。按你的思路在输入in 和 out 之后,要进行判断在进行输入那样需要一个回车的吧。如果oj 是 in 1 7 中间是空格输入是不是 oj判断就是错的了。我觉得换个方式比较好 这一条指令作为一个字符串数组, 在判断in out 进行后续操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-8 11:26:05 | 显示全部楼层
0mrli0 发表于 2017-3-7 11:54
还没看题,不过这样的表达方式,空格和回车是都可以的

好吧 我表示抱歉- -太久没用scanf了 基础东西有点忘了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-30 22:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表