HDU 5071:Chat(2014 Asia AnShan Regional Contest)

Chat

题目链接:

http://acm.split.hdu.edu.cn/showproblem.php?pid=5071

题意:

给出8种操作,输出对应的结果

 

题解:

挺麻烦的一个模拟题,仔细看操作就能A,数据不大暴力就行了,注意结束的时候输出Bye要先输出always on top的情况,不存在某人关闭了聊天框又打开的情况。

 

代码

#include<stdio.h>
#include<queue>
#include<math.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=5001;
char s[10];
struct node
{
    int p;
    long long time;
}q[N];
int len,top,w;
void Untop()
{
    printf("Operation #%d: ",w);
    if(top==-1)printf("no such person.\n");
    else
    {
        printf("success.\n");
        top=-1;
    }
}
void Chat()
{
    long long x;
    scanf("%lld",&x);
    printf("Operation #%d: ",w);
    if(!len)printf("empty.\n");
    else
    {
        bool u=false;
        if(top!=-1)
        {
            for(int i=1;i<=len;++i)
            if(q[i].p==top)
            {
                q[i].time+=x;
                u=true;
                break;
            }
        }
        if(!u)q[1].time+=x;
        printf("success.\n");
    }
}
void Prior()
{
    printf("Operation #%d: ",w);
    if(!len)printf("empty.\n");
    else
    {
        printf("success.\n");
        node ss=q[1];
        int vv=1;
        for(int i=2;i<=len;++i)
        if(q[i].p>ss.p)ss=q[i],vv=i;
        for(int i=vv;i>=2;--i)
        q[i]=q[i-1];
        q[1]=ss;
    }
}
void Add()
{
    int x;
    scanf("%d",&x);
    printf("Operation #%d: ",w);
    bool u=false;
    for(int i=1;i<=len;++i)
    if(q[i].p==x)
    {
        u=true;
        break;
    }
    if(u)printf("same priority.\n");
    else
    {
        printf("success.\n");
        q[++len].p=x;
        q[len].time=0;
    }
}
void Close()
{
    long long u=-1;
    int vv,x;
    scanf("%d",&x);
    printf("Operation #%d: ",w);
    for(int i=1;i<=len;++i)
    if(q[i].p==x)
    {
        u=q[i].time;
        vv=i;
        break;
    }
    if(u==-1)printf("invalid priority.\n");
    else
    {
        printf("close %d with %lld.\n",x,u);
        for(int i=vv;i<len;++i)
        q[i]=q[i+1];
        len--;
    }
}
void Rotate()
{
    int x;
    scanf("%d",&x);
    printf("Operation #%d: ",w);
    if(x<1||x>len)printf("out of range.\n");
    else
    {
        printf("success.\n");
        q[0]=q[x];
        for(int i=x;i>1;--i)
        q[i]=q[i-1];
        q[1]=q[0];
    }
}
void Choose()
{
    int u=-1,vv,x;
    scanf("%d",&x);
    printf("Operation #%d: ",w);
    for(int i=1;i<=len;++i)
    if(q[i].p==x)
    {
        u=q[i].time;
        vv=i;
        break;
    }
    if(u==-1)printf("invalid priority.\n");
    else
    {
        printf("success.\n");
        q[0]=q[vv];
        for(int i=vv;i>1;--i)
        q[i]=q[i-1];
        q[1]=q[0]; 
    }
}
void Top()
{
    int x;
    bool u=true;
    scanf("%d",&x);
    printf("Operation #%d: ",w);
    for(int i=1;i<=len;++i)
    if(q[i].p==x)
    {
        u=false;
        break;
    }
    if(u)printf("invalid priority.\n");
    else
    {
        printf("success.\n");
        top=x;
    }
}
void solve()
{
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        len=0;
        top=-1;
        int x;
        for(w=1;w<=n;++w)
        {
            scanf("%s",s);
            if(s[0]=='U')Untop();
            if(!strcmp(s,"Chat"))Chat();
            if(s[0]=='P')Prior();
            if(s[0]=='A')Add();
            if(!strcmp(s,"Close"))Close();
            if(s[0]=='R')Rotate();
            if(!strcmp(s,"Choose"))Choose();
            if(s[0]=='T')Top();
        }
        if(top!=-1)
        {
            for(int i=1;i<=len;++i)
            if(q[i].p==top&&q[i].time>0)
            {
                printf("Bye %d: %lld\n",top,q[i].time);
                break;
            }
        }
        for(int i=1;i<=len;++i)
        if(q[i].time>0&&q[i].p!=top)printf("Bye %d: %lld\n",q[i].p,q[i].time);
    }
}
int main()
{
    solve();
    return 0;
}
posted @ 2016-08-31 16:27  kiuhghcsc  阅读(253)  评论(0编辑  收藏  举报