这题就是一个模拟题,发现这题有很多细节我没注意,另外在记录处于top的窗口时,我代码写成记录处于top窗口的位置去了。。。。
1.CLJ对妹子说的话应该用__int64 (自以为不会爆int,都没仔细看)
2.所有操作执行完之后,CLJ会先关闭处于top状态的窗口,然后按队列依次关闭窗口
代码:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
map<int, __int64> m;
int q[5555];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
int front= 1, rear= 0, top= -1;
for(int N= 1; N<= n; N++)
{
char ch[20];
int x;
scanf("%s",ch+1);
printf("Operation #%d: ",N);
if(ch[1]== 'A')
{
scanf("%d",&x);
int flag= 0;
for(int i= 1; i<= rear; i++)
if(q[i]== x)
{
flag= 1;
break;
}
if(flag)
printf("same priority.\n");
else
{
m[x]= 0;
q[++rear]= x;
printf("success.\n");
}
}
// Add
else if(ch[1]== 'C' && ch[2]== 'l')
{
scanf("%d",&x);
int pre= -1;
for(int i= front; i<= rear; i++)
if(q[i]== x)
{
pre= i;
break;
}
if(pre!= -1)
{
if(top== x)
top= -1; // 如果总是在上的window被关闭了
for(int i= pre; i< rear; i++)
q[i]= q[i+1];
rear--; //删除该元素
printf("close %d with %I64d.\n",x,m[x]);
m[x]= 0;
}
else
printf("invalid priority.\n");
}
// close
else if(ch[1]== 'C' && ch[2]== 'h' && ch[3]== 'a')
{
scanf("%d",&x);
if(rear< 1)
printf("empty.\n");
else
{
if(top!= -1)
m[top]+= x; // 总是在上的优先
else
m[q[1]]+= x;
printf("success.\n");
}
}
// chat
else if(ch[1]== 'R')
{
scanf("%d",&x);
if(x< 1 || x> rear)
printf("out of range.\n");
else
{
int temp= q[x];
for(int i= x; i> 1; i--)
q[i]= q[i-1];
q[1]= temp;
printf("success.\n");
}
}
// Rotate
else if(ch[1]== 'P')
{
if(rear< 1)
printf("empty.\n");
else
{
int maxx= q[1], pre= 1;
for(int i= 1; i<= rear; i++)
if(q[i]> maxx)
{
maxx= q[i];
pre= i;
}
int temp= q[pre];
for(int i= pre; i> 1; i--)
q[i]= q[i-1];
q[1]= temp;
printf("success.\n");
}
}
//Prior
else if(ch[1]== 'C' && ch[2]== 'h' && ch[3]== 'o')
{
scanf("%d",&x);
int pre= -1;
for(int i= 1; i<= rear; i++)
if(q[i]== x)
{
pre= i;
break;
}
if(pre!= -1)
{
int temp= q[pre];
for(int i= pre; i> 1; i--)
q[i]= q[i-1];
q[1]= temp;
printf("success.\n");
}
else
printf("invalid priority.\n");
}
//choose
else if(ch[1]== 'T')
{
scanf("%d",&x);
int pre= -1;
for(int i= 1; i<= rear; i++)
if(q[i]== x)
{
pre= i;
break;
}
if(pre!= -1)
{
top= x; //哭瞎了 这里我写成了top= pre
printf("success.\n");
}
else
printf("invalid priority.\n");
}
//top
else if(ch[1]== 'U')
{
if(top== -1)
printf("no such person.\n");
else
{
top= -1;
printf("success.\n");
}
}
//Untop
}
if(top!= -1 && m[top])
printf("Bye %d: %I64d\n",top, m[top]);
for(int i= 1; i<= rear; i++)
if(q[i]!= top && m[q[i]])
printf("Bye %d: %I64d\n",q[i],m[q[i]]);
}
return 0;
}