南邮 OJ 1666 图书馆

时间:2022-04-15 17:48:18

图书馆

时间限制(普通/Java) :  3000 MS/ 9000 MS          运行内存限制 : 65536 KByte
总提交 : 200            测试通过 : 47 

比赛描述

临近期末,去图书馆自习的人越来越多。图书馆一共有N张桌子,依次编号为1,2……,N;每张桌子都配有6把椅子。结伴去自习的GGMM们有个习惯,优先选择已坐人数最少的桌子,如果不只一种选择,则选择编号最小的桌子。同时,他们不会分开选择不同的桌子。




输入

多组测试数据,每组数据第1行输入两个正整数N,Q(1≤N,Q≤50000)。接下来输入Q行,依次描述Q组事件。事件的输入格式如下:

     I a:有a位结伴的GGMM进入图书馆自习;

    D a b:编号为b的桌子上有a位GGMM离开;

    C b:查询编号为b的桌子的空位数;

(1≤a≤6,1≤b≤N,第一组事件发生之前所有的座位都是空着的)输入直至文件结尾。


输出

每组数据输出Q行。

对于事件①:如果成功地找到了座位,则输出桌子的编号,如果没能找到则输出“failed”;

对于事件②:如果编号为b的桌子当前坐着的人数小于a则输出“error”,并过滤这组事件,否则正常处理并输出“success”;

对于事件③:按要求输出空位数。(具体格式见样例)


样例输入

1 5
I 5
I 2
D 6 1
C 1
D 3 1
2 5
I 1
I 1
I 3
I 3
I 3

样例输出

1
failed
error
1
success
1
2
1
2
failed

题目来源

openxxx





de<set>
#define MAX_PLACE 6
using namespace std;

set<int> tableNoWithPlace[MAX_PLACE+1];
set<int>::iterator it;

void in(){
	int a, i, tableNo;
	cin>>a;
	for(i=MAX_PLACE; i>=a; i--){
		if(!tableNoWithPlace[i].empty()){
			break;
		}
	}
	if(i>=a){
		it = tableNoWithPlace[i].begin();
		tableNo = *it;
		tableNoWithPlace[i].erase(it);
		tableNoWithPlace[i-a].insert(tableNo);
		cout<<tableNo<<endl;
	}else{
		cout<<"failed"<<endl;
	}
}

void out(){
	int a, b, i;
	cin>>a>>b;
	for(i=0; i<=MAX_PLACE-a; i++){
		if(tableNoWithPlace[i].count(b)){
			break;
		}
	}
	if(i<=MAX_PLACE-a){
		tableNoWithPlace[i].erase(b);
		tableNoWithPlace[i+a].insert(b);
		cout<<"success"<<endl;
	}else{
		cout<<"error"<<endl;
	}
}

void ask(){
	int b, i;
	cin>>b;
	for(i=0; i<=MAX_PLACE; i++){
		if( tableNoWithPlace[i].count(b) ){
			break;
		}
	}
	cout<<i<<endl;
}

int main(){
	int N, Q, i;
	char operation;
	while(cin>>N>>Q){
		for(i=0; i<=MAX_PLACE; i++){
			tableNoWithPlace[i].clear();
		}
		for(i=1; i<=N; i++){
			tableNoWithPlace[6].insert(i);
		}
		while(Q--){
			cin>>operation;
			switch (operation){
				case 'I':
					in();
					break;
				case 'D':
					out();
					break;
				case 'C':
					ask();
					break;
				default:
					break;
			}
		}
	}
}