TYVJ 1154 买饭队列 解题报告
啊啊啊啊,越来越没用了,这么简单的题不知道提交了多少次。!~~
直接模拟就是,不好维护的是最大高度,因为高度的范围是(0, maxin),但是这个maxint是pascal的,是32767,所以果断用used[i]保存高度为i的有多少人。
代码:
#include <stdio.h> #include <stdlib.h> #define MAX 500000 int used[32768]; int queue[MAX]; int head, rear; int count; int max; void enqueue(int k) { count++; used[k]++; queue[rear] = k; rear = (rear + 1) % MAX; if(k > max){ max = k; } } void exqueue(void) { int i; int k; count--; k = queue[head]; used[k]--; if(max == k && used[k] == 0){ for(i = k - 1; i > 0; i--){ if(used[i]){ break; } } max = i; } head = (head + 1) % MAX; } int main(int argc, char **argv) { int i; int n; int a, b; // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); scanf("%d", &n); for(i = 1; i <= n; i++){ scanf("%d", &a); switch(a){ case 1: printf("%d\n", count); break; case 2: exqueue(); break; case 3: scanf("%d", &b); enqueue(b); break; case 4: printf("%d\n", max); break; } } return 0; }