hdu 5071 Chat(模拟)

其实这个模拟并不复杂,我是用map映射每个priority的状态,也可以写成结构体。


个人感觉的几个坑:

1.close窗口后word数要清零,并不是我开始以为的像聊天记录一样的累积的。

2.最后输出的时候有always on top状态的要先输出,然后再按顺序输出。

3.只能有一个on top状态的,Top一个窗口时要取消其他的Top状态。

4.rotate时不但要判断操作数是否大于MAX,还要判断是否小于1


代码:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#include <queue>
#include <set>
#include <map>
#define LL long long
int a[6000];
map<int,LL>w;
int len;
map<int,bool >top;

void add(int n){
	for(int i=1;i<=len;i++){
		if(a[i]==n){
			printf("same priority.\n");
			return ;
		}
	}
	len++;
	a[len]=n;
	printf("success.\n");
}

void close(int n){
	int p=-1;
	for(int i=1;i<=len;i++){
		if(a[i]==n){
		    p=i;
		    break;
		}
	}

	if(p!=-1){
		top[a[p]]=0;
		//w[a[p]]=0;
		printf("close %d with %I64d.\n",n,w[a[p]]);
		w[a[p]]=0;
		for(int i=p;i<=len-1;i++){
			a[i]=a[i+1];
		}
		len--;
	}
	else printf("invalid priority.\n");
}

void chat(int n){
	for(int i=1;i<=len;i++){
		if(top[a[i]]){
			w[a[i]]+=n;
			printf("success.\n");
			return ;
		}
	}
	if(len<=0){
		printf("empty.\n");
		return ;
	}
	else{
		w[a[1]]+=n;
		printf("success.\n");
	}
}

void movetotop(int n){
    int tmp=a[n];
	for(int i=n-1;i>=1;i--){
		a[i+1]=a[i];
	}
	a[1]=tmp;
}
void Rotate(int n){
	if(len<n||n<1){
		printf("out of range.\n");
		return ;
	}
	else{
		movetotop(n);
		printf("success.\n");
		return ;
	}
}

void prior(){
	if(len<=0){
		printf("empty.\n");
		return ;
	}
	int tmp=-1,n=0;
	for(int i=1;i<=len;i++){
		if(a[i]>tmp){
			tmp=a[i];
			n=i;
		}
	}
	movetotop(n);
	printf("success.\n");
	return ;
}

void choose(int n){
	int p=-1;
	for(int i=1;i<=len;i++){
		if(a[i]==n){
			p=i;
			break;
		}
	}
	if(p==-1){
		printf("invalid priority.\n");
		return ;
	}
	movetotop(p);
	printf("success.\n");
}

void Top(int n){
	int p=-1;
	for(int i=1;i<=len;i++){
		if(a[i]==n){
			p=i;
			break;
		}
	}
	if(p==-1){
		printf("invalid priority.\n");
		return ;
	}
	for(int i=1;i<=len;i++){
		if(top[a[i]]&&i!=p){
			top[a[i]]=0;
		}
	}
	top[a[p]]=1;
	printf("success.\n");
}

void untop(){
	int p=-1;
	for(int i=1;i<=len;i++){
		if(top[a[i]]){
			p=i;
			break;
		}
	}
	if(p==-1){
		printf("no such person.\n");
		return ;
	}
	top[a[p]]=0;
	printf("success.\n");
}


int main(){
	//freopen("output.txt",'w',stdout);
	int T;
	cin>>T;
	while(T--){
		w.clear();
		top.clear();
		memset(a,0,sizeof(a));
		len=0;
		int N;
		cin>>N;
		int flag=1;
		while(N--){

			char t[20];int n;
			scanf("%s",t);
			printf("Operation #%d: ",flag++);
			if(t[0]=='A'){
				scanf("%d",&n);
				add(n);
			}
			else if(t[0]=='C'&&t[1]=='l'){
				scanf("%d",&n);
				close(n);
			}
			else if(t[0]=='C'&&t[1]=='h'&&t[2]=='a'){
				scanf("%d",&n);
				chat(n);
			}
			else if(t[0]=='R'){
				scanf("%d",&n);
				Rotate(n);
			}
			else if(t[0]=='P'){
				prior();
			}
			else if(t[0]=='C'&&t[1]=='h'&&t[2]=='o'){
				scanf("%d",&n);
				choose(n);
			}
			else if(t[0]=='T'){
				scanf("%d",&n);
				Top(n);
			}
			else if(t[0]=='U'){
				untop();
			}
		}
		for(int i=1;i<=len;i++){
			if(top[a[i]]){
				if(w[a[i]]>0){
					printf("Bye %d: %I64d\n",a[i],w[a[i]]);
					//cout<<w[a[i]]<<endl;
				}
			}
		}
		for(int i=1;i<=len;i++){
			if(top[a[i]]) continue;
			if(w[a[i]]>0) printf("Bye %d: %I64d\n",a[i],w[a[i]]);
		}
	}
	return 0;
}


你可能感兴趣的:(hdu 5071 Chat(模拟))