图书馆
时间限制(普通/Java) :
3000 MS/ 9000 MS 运行内存限制 : 65536 KByte
总提交 : 200 测试通过 : 47
总提交 : 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; } } } }