九度 1334

  http://ac.jobdu.com/problem.php?id=1334

没仔细读题,id>=0,开始为了图省事,把0当成无效的标志了,另外还有一处,q-num+1,本来没算错的,但是去括号时忘了变号,写成了q-num-1,导致十个数据只能过三个,改过来直接全过,看了下榜,居然还是第一个~~

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int n, m, k;
int id, num;
int flag[102];
char command[10];

bool
check (int *start, int length)
{
  int *q = start + length - 1;
  while (start <= q)
    {
      if ((*start) != -1)
	{
	  return false;
	}
      start++;
    }
  return true;
}

void
mark (int *start, int id, int length)
{
  int *q = start + length - 1;
  while (start <= q)
    {
      *start = id;
      start++;
    }
}

int
main ()
{
  while (scanf ("%d%d", &n, &m) != EOF)
    {
      int *mat = (int *) malloc (sizeof (int) * n * n);
      int i;
      int *p = mat;
      for(i=0;i<102;i++)
	flag[i]=-1;
      for (i = 1; i <= n * n; i++)
	{
	  *p = -1;
	  p++;
	}
      scanf ("%d", &k);
      for (i = 1; i <= k; i++)
	{
	  scanf ("%s",command);
	  
	  if (strcmp (command, "in") == 0)
	    {
	      scanf("%d%d",&id,&num);
	      if (flag[id]!=-1)
		{
		  printf ("no\n");
		  continue;
		}
	      bool fflag=false;
	      int *p = mat;
	      int *q = mat + n * n-1;
	      if(num>n*n){
		printf("no\n");
		continue;
		}	      
	      while (p <= q - num+1)
		{
		  if (check (p, num))
		    {
		      printf ("yes\n");
		      mark (p, id, num);
		      flag[id]=id;
		      fflag=true;
		      break;
		    }
		  p++;
		}
	      if (!fflag)
		printf ("no\n");
	    }
	  else if (strcmp (command, "out") == 0)
	    {
	      scanf("%d",&id);
	      if (flag[id]==-1)
		{
//		  printf ("no\n");
		  continue;
		}
	      flag[id] = -1;
	      int *p = mat;
	      int *q = mat + n * n-1;
	      while (p <= q)
		{
		  if (*p == id)
		    *p = -1;
		  p++;
		}
//	      printf ("yes\n");
	    }
	}
      free (mat);
    }
  return 0;
}
原文地址:https://www.cnblogs.com/yangce/p/2256480.html