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;
}