hdu 5071 Chat(模拟)

来源:互联网 发布:小刀娱乐网源码php 编辑:程序博客网 时间:2024/06/07 01:19

其实这个模拟并不复杂,我是用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 longint 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;}


0 0
原创粉丝点击