hdu 5071 Chat /2014鞍山现场赛B题 (模拟)

这题就是一个模拟题,发现这题有很多细节我没注意,另外在记录处于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;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值