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