大致题意:
自己读
大致思路:
直接模拟,注意坑点:word值要用longlong,删除掉的点可能是always on top点,最后say goodbye的时候要先和top的人说
不明白的一点是,明明参数值会达到10^9为什么不能用hashmap?
#include<iostream> #include<cstring> #include<cstdio> #include<map> #include<algorithm> using namespace std; const int nMax=10010; int n,num[nMax],id[nMax],u,mtt; long long word[nMax],x; char str[101]; map<int ,int>mpp,rempp; int hashmap(int a){ rempp[a]=a; return a; // if(mpp[a]!=0)return mpp[a]; // else{ // mpp[a]=++mtt; // rempp[mpp[a]]=a; // } // return mpp[a]; } int main(){ int i,j,k,tcs,tot,aot,a,tmp; cin>>tcs; while(tcs--){ cin>>tot; tmp=1; n=0; aot=-1; mtt=0; mpp.clear(); rempp.clear(); memset(word,0,sizeof(word)); memset(id,-1,sizeof(id)); while(tot--){ scanf("%s",str); if(strcmp(str,"Add")==0){ cin>>u; u=hashmap(u); printf("Operation #%d: ",tmp++); if(id[u] != -1){ cout<<"same priority.\n"; }else{ num[++n] = u; id[u] = n; cout<<"success.\n"; } }else if(strcmp(str,"Close")==0){ cin>>u; u=hashmap(u); printf("Operation #%d: ",tmp++); if(id[u]==-1){ cout<<"invalid priority.\n"; }else{ if(aot==u)aot=-1; for(i=id[u];i<n;i++){ num[i]=num[i+1]; id[num[i]]--; }n--; printf("close %d with %I64d.\n",rempp[u],word[u]); word[u]=0; id[u]=-1; } }else if(strcmp("Chat",str)==0){ cin>>x; printf("Operation #%d: ",tmp++); if(n==0){ printf("empty.\n"); }else{ if(aot==-1){ word[num[1]]+=x; // cout<<num[1]<<" add "<<x<<endl; }else{ word[aot]+=x; // cout<<aot<<" add "<<x<<endl; } cout<<"success.\n"; } }else if(strcmp("Rotate",str)==0){ cin>>x; printf("Operation #%d: ",tmp++); if(x>n||x<1){ printf("out of range.\n"); }else{ a=num[x]; for(i=x;i>1;i--){ num[i]=num[i-1]; id[num[i]]++; } id[a]=1; num[1]=a; cout<<"success.\n"; } }else if(strcmp("Prior",str)==0){ printf("Operation #%d: ",tmp++); if(n == 0){ cout<<"empty."<<endl; }else{ int bbg=0; for(i=1;i<=n;i++){ if(rempp[num[i]]>=bbg){ bbg=rempp[num[i]]; x=i; } } // x = max_element(num+1,num+n+1) - num ; /////////////////////////////////////// ///bug ///////////////////////////////////// a=num[x]; for(i=x;i>1;i--){ num[i]=num[i-1]; id[num[i]]++; } id[a]=1; num[1]=a; cout<<"success.\n"; } }else if(strcmp("Choose",str)==0){ cin>>u; u=hashmap(u); printf("Operation #%d: ",tmp++); x = id[u]; if(x==-1){ cout<<"invalid priority.\n"; }else{ a=num[x]; for(i=x;i>1;i--){ num[i]=num[i-1]; id[num[i]]++; } id[a]=1; num[1]=a; cout<<"success.\n"; } }else if(strcmp("Top",str)==0){ cin>>u; u=hashmap(u); printf("Operation #%d: ",tmp++); if(id[u]==-1){ cout<<"invalid priority.\n"; }else{ aot=u; cout<<"success.\n"; } }else if(strcmp("Untop",str)==0){ printf("Operation #%d: ",tmp++); if(aot==-1){ cout<<"no such person.\n"; }else{ aot=-1; cout<<"success.\n"; } } } if(aot!=-1&&word[aot]){ a=rempp[aot]; printf("Bye %d: %d\n",a,word[aot]); } for(i=1;i<=n;i++){ if(word[num[i]]!=0){ a=rempp[num[i]]; if(a!=aot)printf("Bye %d: %d\n",a,word[num[i]]); } } } return 0; }
相关推荐
HDOJ题目分类HDOJ题目分类HDOJ题目分类
ACM ICPC HDOJ1002
ACM ICPC HDOJ1001
hdoj1001标程
hdoj上的资源,代码有注释,很不错的哦
hdoj1004,解题代码,答案代码,欢迎下载
ACM ICPC HDOJ1003
ACM ICPC HDOJ1008
杭州电子科技大学hdoj1002,大整数相加问题
杭州电子科大HDOJ
c语言 最短路 是hdoj上的一个最短路问题,写的很牛
ACM ICPC HDOJ1000
hdoj解题代码,题目为1000-1050
一些HDOJ上的DP题目的小总结,但愿能帮到那些想专攻DP的人吧
codj,hdoj的源码(50-60题)
hdoj 2013 多校训练3标程+解题报告
HDOJ 源代码 包含几百道HDOJ题目源码
hdoj1005 Number Sequence, 杭州电子科技大学oj题目代码
杭电OJ(1000-1099) AC 代码
HDOJ使用指南——公开版.docHDOJ使用指南——公开版.docHDOJ使用指南——公开版.doc