hdu 5071 Chat(大模拟)

来源:互联网 发布:淘宝账号购买 编辑:程序博客网 时间:2024/06/05 16:38

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5071

大模拟,有几个wa点

1.top的意思是设置一个特殊的位置,这个位置的优先级在队列最前端之上,并且被设置的u在队列中的初始位置不被改变,所以这个位置就像是指向队列某个元素的指针。

2.chat的操作要先考虑特殊位置的节点。

3.say bye的时候要先给最特殊位置的节点say bye然后再按照队列的顺序一个一个say bye

4.words 为零的节点不用say bye

5.记住用long long!!!!!

这些点都注意了,这道题目还是比较水的,但是现场赛这道题目的通过率不高,主要是敲大模拟太浪费时间了~

code:

#include <cstdio>#include <cstdlib>#include <iostream>#include <vector>#include <cstring>using namespace std;typedef long long LL;const int maxn=10000;char dd[10][10]={"Add","Close","Chat","Rotate","Prior","Choose","Top","Untop"};typedef pair<int,LL> P;int top;vector<P> pp;void add(int key,vector<P> &m){    bool flag=1;    P mid;    mid.first=key;    mid.second=0;    for(int i=0;i<m.size();i++){        if(m[i].first==mid.first){            flag=0;            break;        }    }    if(!flag){        printf("same priority.\n");        return ;    }    m.push_back(mid);    printf("success.\n");    return ;}void del(int key,vector<P> &m){    int flag=-1;    for(int i=0;i<m.size();i++){        if(m[i].first==key){            flag=i;            break;        }    }    if(flag==-1){        printf("invalid priority.\n");        return ;    }    else{        if(top==key) top=-1;        printf("close %d with %I64d.\n",m[flag].first,m[flag].second);        m.erase(m.begin()+flag);        return ;    }}void chat(int w,vector<P> &m){    if(!m.size()){        printf("empty.\n");        return ;    }    else{        if(top!=-1){            for(int i=0;i<m.size();i++){                if(m[i].first==top){                    m[i].second+=w;                    printf("success.\n");                    return ;                }            }        }        else{            m[0].second+=w;            printf("success.\n");            return ;        }    }}void Rotate(int u,vector<P> &m){    P mid;    if(u>=1&&u<=m.size()){        mid=m[u-1];        m.erase(m.begin()+u-1);        m.insert(m.begin(),mid);        printf("success.\n");        return ;    }    else{        printf("out of range.\n");        return ;    }}void Prior(vector<P> &m){    if(!m.size()){        printf("empty.\n");        return ;    }    else{        printf("success.\n");        int nn=0;        P mid;        for(int i=1;i<m.size();i++){            if(m[i].first>m[nn].first) nn=i;        }        mid=m[nn];        m.erase(m.begin()+nn);        m.insert(m.begin(),mid);    }}void choose(int u,vector<P> &m){    P mid;    mid.first=-1;    mid.second=-1;    int kk=-1;    for(int i=0;i<m.size();i++){        if(m[i].first==u){            mid.first=m[i].first;            mid.second=m[i].second;            kk=i;            break;        }    }    if(mid.first==-1){        printf("invalid priority.\n");        return ;    }    else{        m.erase(m.begin()+kk);        m.insert(m.begin(),mid);        printf("success.\n");        return ;    }}void Top(int u,vector<P> &m){    P mid;    bool flag=0;    for(int i=0;i<m.size();i++){        if(m[i].first==u){            flag=1;            break;        }    }    if(flag){        printf("success.\n");        top=u;        return ;    }    else{        printf("invalid priority.\n");        return ;    }}void Untop(){    if(top==-1){        printf("no such person.\n");    }    else{        printf("success.\n");        top=-1;    }}void say_bye(vector<P> &m){    if(top==-1){        for(int i=0;i<m.size();i++){            if(m[i].second==0) continue;            printf("Bye %d: %I64d\n",m[i].first,m[i].second);        }    }    else{        for(int i=0;i<m.size();i++){            if(m[i].second==0) continue;            if(m[i].first==top){                printf("Bye %d: %I64d\n",m[i].first,m[i].second);                break;            }        }        for(int i=0;i<m.size();i++){            if(m[i].second==0) continue;            if(m[i].first==top) continue;            printf("Bye %d: %I64d\n",m[i].first,m[i].second);        }    }}int main(){    int T,nn,x;    char cc[10];    scanf("%d",&T);    while(T--){        scanf("%d",&nn);        top=-1;        pp.clear();        for(int kk=1;kk<=nn;kk++){            scanf("%s",cc);            printf("Operation #%d: ",kk);            if(!strcmp(cc,dd[0])){                scanf("%d",&x);                add(x,pp);            }            else if(!strcmp(cc,dd[1])){                scanf("%d",&x);                del(x,pp);            }            else if(!strcmp(cc,dd[2])){                scanf("%d",&x);                chat(x,pp);            }            else if(!strcmp(cc,dd[3])){                scanf("%d",&x);                Rotate(x,pp);            }            else if(!strcmp(cc,dd[4])){                Prior(pp);            }            else if(!strcmp(cc,dd[5])){                scanf("%d",&x);                choose(x,pp);            }            else if(!strcmp(cc,dd[6])){                scanf("%d",&x);                Top(x,pp);            }            else if(!strcmp(cc,dd[7])){                Untop();            }        }        say_bye(pp);    }    return 0;}


0 0