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