考察英語的題 - -#
按條件模擬,一遍就行了,每個聊天對象有其價值U,數組模擬隊列過程即可,若存在Top標記,則和Top標記的人聊天,否則和隊列的第一個人聊天
mark記錄隊尾,top記錄Top操作,data[i].p記錄U,data[i].x記錄chat數,data[i].y記錄該人是否被刪除
Add U:在 隊尾插入價值為U的人,需要特判U人已經存在
Close U::在整個隊列中查找價值為U的人,將其刪除,需要特判該人不存在
Chat x:當前聊天頁面的人chat+=x,特判當前隊列沒有人
Rotata x: 使當前隊列排在第x位的人放在第1位,其余的依次向後退一位,特判沒有第x位
Prior: 找出當前隊列中價值最大的人,把其放在第1位,其余的依次向後退一位,特判隊列空
Choose U:找到價值為U的人,把其放在第1位,其余的依次向後退一位,特判沒有該價值的人
Top U:標記價值為U的人,將其標為top,始終與她聊天,但不放到隊列第一位,直到Untop,特判沒有這個人
Untop:取消TOP標記,並回復與隊列第一位聊天,特判當前沒有Top標記
最後所有指令執行完後
需要從隊列第一位依次和還沒有Close並且Chat!=0的人 執行Bye操作,若有Top,先和Top-Bye
Bye:輸出當前人的U和chat數
#include "stdio.h" #include "string.h" struct node { int p,y; __int64 x; }data[50010]; int mark,top; void Add() { int ok,x,i; ok=1; scanf("%d",&x); for (i=1;i<=mark;i++) if (data[i].y==0 && data[i].p==x) { ok=0; break;} if (ok==0) { printf("same priority.\n"); return ; } printf("success.\n"); mark++; data[mark].p=x; data[mark].x=0; } void Close() { int ok,x,i; ok=0; scanf("%d",&x); for (i=1;i<=mark;i++) if (data[i].y==0 && data[i].p==x) { ok=i; break;} if (ok==0) { printf("invalid priority.\n"); return ; } data[i].y=1; if (top==ok) top=0; printf("close %d with %I64d.\n",data[ok].p,data[ok].x); } void Chat() { int ok,i; __int64 x; scanf("%I64d",&x); if (top!=0) { data[top].x+=x; printf("success.\n"); return ; } ok=0; for (i=1;i<=mark;i++) if (data[i].y==0) {ok=i; break;} if (ok==0) printf("empty.\n"); else printf("success.\n"); data[ok].x+=x; } void Rotate() { node temp; int cnt,j,x,i,first; cnt=0; scanf("%d",&x); first=0; for (i=1;i<=mark;i++) if (data[i].y==0) { if (first==0) first=i; cnt++; if (cnt==x) break; } if (cnt==x) { printf("success.\n"); temp=data[i]; if (top==i) top=1; else if (top!=0 && top1;j--) data[j]=data[j-1]; data[1]=temp; return ; } printf("out of range.\n"); } void Prior() { int Max,i,id; node temp; Max=0; if (mark==0) { printf("empty.\n"); return ; } for (i=1;i<=mark;i++) if(data[i].y==0 && data[i].p>Max) { Max=data[i].p; id=i; } if (Max==0) { printf("empty.\n"); return ; } printf("success.\n"); temp=data[id]; if (top==id) top=1; else if (top!=0 && top1;i--) data[i]=data[i-1]; data[1]=temp; } void Choose() { int ok,x,i,first; node temp; scanf("%d",&x); ok=0; first=0; for (i=1;i<=mark;i++) if(data[i].y==0) { if (first==0) first=i; if (data[i].p==x) { ok=i; break; } } if (ok==0) { printf("invalid priority.\n"); return ; } temp=data[ok]; if (top==ok) top=1; else if (top!=0 && top 1;i--) data[i]=data[i-1]; data[1]=temp; printf("success.\n"); } void Top() { int i,ok,x; scanf("%d",&x); ok=0; for (i=1;i<=mark;i++) if (data[i].y==0 && data[i].p==x) { top=i; ok=1; break; } if (ok==1) printf("success.\n"); else printf("invalid priority.\n"); } void Untop() { if (top==0) printf("no such person.\n"); else printf("success.\n"); top=0; } int main() { int Case,ii,i,n; char str[101]; scanf("%d",&Case); while(Case--) { scanf("%d",&n); mark=0; top=0; memset(data,0,sizeof(data)); for (ii=1;ii<=n;ii++) { scanf("%s",str); printf("Operation #%d: ",ii); if (strcmp(str,"Add")==0) Add(); if (strcmp(str,"Close")==0) Close(); if (strcmp(str,"Chat")==0) Chat(); if (strcmp(str,"Rotate")==0) Rotate(); if (strcmp(str,"Prior")==0) Prior(); if (strcmp(str,"Choose")==0) Choose(); if (strcmp(str,"Top")==0) Top(); if (strcmp(str,"Untop")==0) Untop(); } if (top!=0 && data[top].x!=0) { printf("Bye %d: %I64d\n",data[top].p,data[top].x); data[top].y=1; } for (i=1;i<=mark;i++) if (data[i].y==0 && data[i].x!=0) printf("Bye %d: %I64d\n",data[i].p,data[i].x); } return 0; }