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;
}
posted @ 2011-07-18 10:08  zqynux  阅读(174)  评论(0编辑  收藏  举报