`
暴风雪
  • 浏览: 378051 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[模拟]hdoj 5071

 
阅读更多

大致题意:

       自己读

 

大致思路:

       直接模拟,注意坑点: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;
}

 

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics