其实这个模拟并不复杂,我是用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;
}
本文详细介绍了优先级管理与窗口控制的操作方法,包括添加、关闭、聊天、旋转、移动到顶部、获取最高优先级窗口等。同时,讨论了优先级窗口的Top状态和取消Top状态的操作细节。
&spm=1001.2101.3001.5002&articleId=40649585&d=1&t=3&u=7ebb6d307a4c41a7a2f8a8c4909dced8)
581

被折叠的 条评论
为什么被折叠?



