[大模拟]两种方式解决Chat(UVALive-7047)大模拟
来源:互联网 发布:儿童 编程网站 编辑:程序博客网 时间:2024/05/18 13:43
Part 1:题目地址
1.UVALive Chat UVALive - 7047
2.Virtual Judge Chat UVALive - 7047
3.HDU Chat UVALive - 7047
Part 2:解题思路和注意点
大模拟题的关键是使用的工具和编码的严谨,由题意可以得到这个模拟题有很多插入,删除,更换位置,访问的操作,这些操作的总数不是很多,所以时间复杂度的问题可以放在后面,主要问题是实现这些功能。
我的做法是使用链表来完成这个模拟题,链表虽然写起来比较麻烦,但是只要注意指针的方向,及时控制好释放空间,运用模块化的思想,可以大大减少代码量(当然相对于使用STL模板来说代码量肯定还是多的)。
Chat这个题主要是九个操作:
1.Add u:
在队列末尾增加一个priority为u的人,如果这人已经在队列里面,就输出same priority,否则输出success.
2.Close u:
在队列中删除一个priority为u的人,如果这个人不在队列里面,就输出invalid priority,否则输出success.
3.Chat w:
与队列第一个人聊w句话,注意,如果存在有top标记的人,则要和这个人说w句,而不是队列第一个人,如果队列为空就是empty,否则输出success.
4.Rotate x:
将队列中第x人移到队列的第一个位置,如果x大于队列人数,就输出out of range,否则输出success
5.Prior:
将队列中priority最高的人移到队列的第一个位置,如果队列为空就是empty,否则输出success.
6.Choose x:
将队列中priority为x的人移到队列的第一个位置,如果这个人不在队列里面,就输出invalid priority,否则输出success.
7.Top x:
将队列中priority为x的人设置为Top,如果这个人不在队列里面,就输出invalid priority,否则输出success.
8.Untop:
取消当前的Top标记,如果当前没有Top标记,就输出no such person,否则输出success.
9.bey(末尾处理):
在结尾,如果队列中还有人,主人公要和所以说过话的人说bey,如果有Top标记的人,就要先和这个人说bey,然后再和其他人说bey。
这些操作主要是标记和更换队列比较有难度,我选择使用map来标记这个人是否在队列中,然后使用链表来模拟队列的情况,同时还有一个Top标记初始值设置为0,如果有了Top操作则设置为该人的priority值。
注意点:
1.Close操作的时候,如果删除的人有top标记,一定要记得还原top标记。
2.可以利用Map的迭代器来找到队列中priority最大的人。
Part 3:代码部分
链表写法
#include<bits/stdc++.h>#define MAXN 100010#define MAXE 100010#define ll long long#define eps 1e-6#define PI acos(-1)#define FILEIN freopen("in.txt","r",stdin)#define FILEOUT freopen("out.txt","w",stdout)#define CLR(x) memset(x,0,sizeof(x))#define MEM(a,x) memset(a,x,sizeof(a))#define PB(x) push_back(x)#define PF(x) push_front(x)#define rep(x,a,b) for(x=a;x<b;x++)void sf(int &x){scanf("%d",&x);}void sf(char &x){scanf("%c",&x);}void sf(double &x){scanf("%lf",&x);}void sf(char *x){scanf("%s",x);}void sf(ll &x){scanf("%I64d",&x);}void pf(int x){printf("%d",x);}void pf(char x){printf("%c",x);}void pf(double x){printf("%f",x);}void pf(char *x){printf("%s",x);}void pf(ll x){printf("%I64d",x);}void pf(){printf("\n");}const ll mod = 1e9+7;const int maxn = 100010;const int INF = 0x7ffffff;const long long LINF = 0x7fffffffffffffff;using namespace std;ll q_pow(ll x,ll y){ll res=1;while(y){if(y&1) res=(res*x)%mod; y>>=1;x=(x*x)%mod;}return res;}ll inv(ll x){return q_pow(x,mod-2);}int Read(){int x=0,F=1;char C=getchar();while(C<'0'||C>'9'){if(C=='-')F=-F;C=getchar();}while(C>='0'&&C<='9'){x=x*10-'0'+C,C=getchar();}return x*F;}int Trans(){char c;sf(c);int res;res=c-'0';return res;}map<int,int>M;map<int,int>::iterator it;int TOPflag=0,LEN=0;struct girls{ int pri;int w; girls *next;}*head;girls*newnode(int x){ girls*p; p=(girls*)malloc(sizeof(girls)); p->pri = x;p->w = 0;p->next=NULL; return p;}void Add(int u){ if(M[u]==1){printf("same priority.\n");return ;} else{ if(head == NULL){ girls *tem; tem = newnode(u); head = tem; } else{ girls *tem,*p; tem = newnode(u);p=head; while(p->next!=NULL){p=p->next;} p->next = tem; } M[u]=1;LEN++; printf("success.\n"); } return ;}void Close(int u){ if(M[u] == 0){printf("invalid priority.\n");return ;} else { girls *pre,*tem; pre = tem = head; while(1){ if(tem->pri == u){ if(head==tem){head=head->next;} pre->next=tem->next; printf("close %d with %d.\n",tem->pri,tem->w); if(tem->pri == TOPflag){TOPflag = 0;} free(tem); break; } else{ pre = tem;tem = tem->next; } } LEN--;M[u]=0; } return ;}void Chat(int w){ if(LEN==0){printf("empty.\n");return ;} else{ if(TOPflag != 0){ girls *tem;tem = head; while(1){ if(tem->pri == TOPflag){ tem->w+=w; printf("success.\n"); break; } else {tem=tem->next;} } } else{head->w+=w;printf("success.\n");} } return ;}void Rotate(int num){ if(num>LEN||num<1){printf("out of range.\n");return ;} else { int cnt=1;girls *tem,*pre; tem=pre=head; while(1){ if(cnt == num){ if(num == 1){printf("success.\n");break;} else{ pre->next=tem->next; tem->next=head; head=tem; printf("success.\n"); break; } } else {cnt++;pre=tem;tem=tem->next;} } } return ;}void Prior(){ if(LEN==0){printf("empty.\n");return;} else{ it=--M.end(); int MAX = (*it).first; girls *tem,*pre; tem=pre=head; while(1){ if(tem->pri == MAX){ if(tem == head){printf("success.\n");break;} pre->next = tem->next; tem->next = head; head = tem; printf("success.\n"); break; } else{pre=tem;tem=tem->next;} } return ; }}void Choose(int u){ if(M[u] == 0){printf("invalid priority.\n");return ;} else{ girls *tem,*pre;tem=pre=head; while(1){ if(tem->pri == u){ if(tem == head){printf("success.\n");break;} pre->next = tem->next; tem->next = head; head = tem; printf("success.\n"); break; } else{pre=tem;tem=tem->next;} } return ; }}void Top(int u){ if(M[u] == 0){printf("invalid priority.\n");return ;} else{TOPflag = u;printf("success.\n");return ;}}void Untop(){ if(TOPflag == 0){printf("no such person.\n");return ;} else{TOPflag = 0;printf("success.\n");return;}}void GOODBEY(){ if(head == NULL){return ;} else{ girls *tem,*pre;tem = pre = head; if(TOPflag !=0){ while(tem->pri!=TOPflag){pre=tem;tem=tem->next;} if(tem==head){head=head->next;} else{ pre->next=tem->next; if(tem->w!=0) printf("Bye %d: %d\n",tem->pri,tem->w); free(tem); } } tem=head; while(tem != NULL){ if(tem->w!=0) printf("Bye %d: %d\n",tem->pri,tem->w); girls *p;p=tem; tem=tem->next; free(p); } } return ;}/*void show(){ if(head == NULL) return ; girls *tem; tem = head; while(tem!=NULL){ printf("%d-%d\n",tem->pri,tem->w); tem=tem->next; } printf("\n");}*/int main(){ int T;cin>>T; while(T--){ head=NULL;TOPflag=0,LEN=0; int n,opid;cin>>n; M.clear(); rep(opid,1,n+1){ //show(); string opname;int num; cin>>opname; cout<<"Operation #"<<opid<<": "; if(opname == "Add"){cin>>num;Add(num);} if(opname == "Close"){cin>>num;Close(num);} if(opname == "Chat"){cin>>num;Chat(num);} if(opname == "Rotate"){cin>>num;Rotate(num);} if(opname == "Prior"){Prior();} if(opname == "Choose"){cin>>num;Choose(num);} if(opname == "Top"){cin>>num;Top(num);} if(opname == "Untop"){Untop();} } GOODBEY(); } return 0;}
当然如果是使用列表则STL中的Vector也可以取代使用。
下面是STL版本:
#include<bits/stdc++.h>#define MAXN 100010#define MAXE 100010#define ll long long#define eps 1e-6#define PI acos(-1)#define FILEIN freopen("in.txt","r",stdin)#define FILEOUT freopen("out.txt","w",stdout)#define CLR(x) memset(x,0,sizeof(x))#define MEM(a,x) memset(a,x,sizeof(a))#define PB(x) push_back(x)#define PF(x) push_front(x)#define rep(x,a,b) for(x=a;x<b;x++)void sf(int &x){scanf("%d",&x);}void sf(char &x){scanf("%c",&x);}void sf(double &x){scanf("%lf",&x);}void sf(char *x){scanf("%s",x);}void sf(ll &x){scanf("%I64d",&x);}void pf(int x){printf("%d",x);}void pf(char x){printf("%c",x);}void pf(double x){printf("%f",x);}void pf(char *x){printf("%s",x);}void pf(ll x){printf("%I64d",x);}void pf(){printf("\n");}const ll mod = 1e9+7;const int maxn = 100010;const int INF = 0x7ffffff;const long long LINF = 0x7fffffffffffffff;using namespace std;ll q_pow(ll x,ll y){ll res=1;while(y){if(y&1) res=(res*x)%mod; y>>=1;x=(x*x)%mod;}return res;}ll inv(ll x){return q_pow(x,mod-2);}int Read(){int x=0,F=1;char C=getchar();while(C<'0'||C>'9'){if(C=='-')F=-F;C=getchar();}while(C>='0'&&C<='9'){x=x*10-'0'+C,C=getchar();}return x*F;}int Trans(){char c;sf(c);int res;res=c-'0';return res;}map<int ,ll>M;map<int ,ll>::iterator iter;vector<int >V;vector<int >::iterator it;string opname;int TOP = 0;void init(){M.clear();V.clear();TOP=0;}void Add(int t){ if(M.find(t)!=M.end()){printf("same priority.\n");return;} V.push_back(t);M[t]=0;printf("success.\n");}void Close(int t){ if(M.find(t)==M.end()){printf("invalid priority.\n");return;} printf("close %d with %lld.\n",t,M[t]); if(TOP==t){TOP=0;} it=find(V.begin(),V.end(),t);V.erase(it);M.erase(t);}void Chat(int t){ if(V.empty()){printf("empty.\n");return ;} if(TOP) M[TOP]+=t; else{ it=V.begin(); M[(*it)]+=t; } printf("success.\n");}void Rotate(int t){ if(t<1||t>V.size()){printf("out of range.\n");return ;} it=V.begin()+(t-1); int girl=(*it);V.erase(it); V.insert(V.begin(),girl); printf("success.\n");}void Prior(){ if(M.empty()){printf("empty.\n");return;} iter=--M.end(); int girl=(*iter).first; it=find(V.begin(),V.end(),girl); V.erase(it);V.insert(V.begin(),girl); printf("success.\n");}void Choose(int t){ if(M.find(t) == M.end()){printf("invalid priority.\n");return ;} it=find(V.begin(),V.end(),t); V.erase(it); V.insert(V.begin(),t); printf("success.\n");}void Top(int t){ if(M.find(t) == M.end()){printf("invalid priority.\n");return ;} TOP=t;printf("success.\n");return ;}void Untop(){ if(TOP==0){printf("no such person.\n");return;} TOP=0;printf("success.\n");return;}int main(){ int cas,n,num; cin>>cas; while(cas--){ init(); cin>>n; for(int i=1;i<=n;i++){ cin>>opname; printf("Operation #%d: ",i); if(opname == "Add"){cin>>num;Add(num);} if(opname == "Close"){cin>>num;Close(num);} if(opname == "Chat"){cin>>num;Chat(num);} if(opname == "Rotate"){cin>>num;Rotate(num);} if(opname == "Prior"){Prior();} if(opname == "Choose"){cin>>num;Choose(num);} if(opname == "Top"){cin>>num;Top(num);} if(opname == "Untop"){Untop();} } if(TOP!=0){ it = find(V.begin(),V.end(),TOP); if(M[(*it)]>0) printf("Bye %d: %lld\n",(*it),M[(*it)]); V.erase(it); } for(it=V.begin();it!=V.end();it++){ if(M[(*it)]>0) printf("Bye %d: %lld\n",(*it),M[(*it)]); } } return 0;}
- [大模拟]两种方式解决Chat(UVALive-7047)大模拟
- hdu 5071 Chat(大模拟)
- HDU 5071 Chat(大模拟)
- 大模拟
- hdu 5071 Chat(模拟)
- HDU 5071 Chat (模拟)
- HDU 5071 Chat(模拟)
- 约瑟夫环问题的两种解决方式(递归求解和数组模拟求解)
- 大整数模拟
- POJ 1835 大模拟
- HDU5237 Base64 大模拟
- hihocoder 1228 大模拟
- ZOJ 3826 大模拟
- PAT1060【大模拟啊】
- 大模拟 中值滤波
- 魔方 大模拟
- 贪心+大模拟?
- HDU-5983(大模拟)
- jQuery面试题
- C++基础-异常
- Tensorflow的一些基本用法
- 计算机图形学笔记---Cg语言(二)
- c++中冒号(:)和双冒号(::)的用法
- [大模拟]两种方式解决Chat(UVALive-7047)大模拟
- Spring PropertyPlaceholderConfigurer解析及应用
- js设计模式的学习
- 【脚本语言系列】关于Python基础知识对象自省,你需要知道的事
- Halcon实战记录之三《模板制作--两点定位》
- 单列模式
- mysql event 定时更新任务
- 装双系统后,在windows下修复linux
- leetcode 350. Intersection of Two Arrays II