HDU 5071 模拟

2015-01-27 18:06:33 · 作者: · 浏览: 42

考察英语的题 - -#

按条件模拟,一遍就行了,每个聊天对象有其价值U,数组模拟队列过程即可,若存在Top标记,则和Top标记的人聊天,否则和队列的第一个人聊天

mark记录队尾,top记录Top操作,data[i].p记录U,data[i].x记录chat数,data[i].y记录该人是否被删除

Add U:在 队尾插入价值为U的人,需要特判U人已经存在

Close U::在整个队列中查找价值为U的人,将其删除,需要特判该人不存在

Chat x:当前聊天页面的人chat+=x,特判当前队列没有人

Rotata x: 使当前队列排在第x位的人放在第1位,其余的依次向后退一位,特判没有第x位

Prior: 找出当前队列中价值最大的人,把其放在第1位,其余的依次向后退一位,特判队列空

Choose U:找到价值为U的人,把其放在第1位,其余的依次向后退一位,特判没有该价值的人

Top U:标记价值为U的人,将其标为top,始终与她聊天,但不放到队列第一位,直到Untop,特判没有这个人

Untop:取消TOP标记,并回复与队列第一位聊天,特判当前没有Top标记

最后所有指令执行完后

需要从队列第一位依次和还没有Close并且Chat!=0的人 执行Bye操作,若有Top,先和Top-Bye

Bye:输出当前人的U和chat数

?

#include "stdio.h"
#include "string.h"

struct node
{
    int p,y;
    __int64 x;
}data[50010];

int mark,top;
void Add()
{
    int ok,x,i;
    ok=1;
    scanf("%d",&x);

    for (i=1;i<=mark;i++)
    if (data[i].y==0 && data[i].p==x) { ok=0; break;}

    if (ok==0)
    {
        printf("same priority.\n");
        return ;
    }
    printf("success.\n");

    mark++;
    data[mark].p=x;
    data[mark].x=0;
}

void Close()
{
    int ok,x,i;
    ok=0;
    scanf("%d",&x);
    for (i=1;i<=mark;i++)
    if (data[i].y==0 && data[i].p==x)  { ok=i; break;}

    if (ok==0)
    {
        printf("invalid priority.\n");
        return ;
    }

    data[i].y=1;
    if (top==ok) top=0;
    printf("close %d with %I64d.\n",data[ok].p,data[ok].x);
}

void Chat()
{
    int ok,i;
    __int64 x;
    scanf("%I64d",&x);
    if (top!=0)
    {
        data[top].x+=x;
        printf("success.\n");
        return ;
    }

    ok=0;
    for (i=1;i<=mark;i++)
    if (data[i].y==0) {ok=i; break;}
    if (ok==0)
        printf("empty.\n");
    else printf("success.\n");

    data[ok].x+=x;

}

void Rotate()
{
    node temp;
    int cnt,j,x,i,first;
    cnt=0;
    scanf("%d",&x);
    first=0;
    for (i=1;i<=mark;i++)
    if (data[i].y==0)
    {
        if (first==0) first=i;
        cnt++;
        if (cnt==x) break;
    }

    if (cnt==x)
    {
        printf("success.\n");
        temp=data[i];
        if (top==i) top=1;
        else
            if (top!=0 && top
  
   1;j--)
            data[j]=data[j-1];
        data[1]=temp;
        return ;
    }

    printf("out of range.\n");
}

void Prior()
{
    int Max,i,id;
    node temp;
    Max=0;
    if (mark==0)
    {
        printf("empty.\n");
        return ;
    }
    for (i=1;i<=mark;i++)
        if(data[i].y==0 && data[i].p>Max)
        {
            Max=data[i].p;
            id=i;
        }
    if (Max==0)
    {
        printf("empty.\n");
        return ;
    }

    printf("success.\n");
    temp=data[id];
    if (top==id) top=1;
    else
    if (top!=0 && top
   
    1;i--) data[i]=data[i-1]; data[1]=temp; } void Choose() { int ok,x,i,first; node temp; scanf("%d",&x); ok=0; first=0; for (i=1;i<=mark;i++) if(data[i].y==0) { if (first==0) first=i; if (data[i].p==x) { ok=i; break; } } if (ok==0) { printf("invalid priority.\n"); return ; } temp=data[ok]; if (top==ok) top=1; else if (top!=0 && top
    
     1;i--) data[i]=data[i-1]; data[1]=temp; printf("success.\n"); } void Top() { int i,ok,x; scanf("%d",&x); ok=0; for (i=1;i<=mark;i++) if (data[i].y==0 && data[i].p==x) { top=i; ok=1; break; } if (ok==1) printf("success.\n"); else printf("invalid priority.\n"); } void Untop() { if (top==0) printf("no such person.\n"); else printf("success.\n"); top=0; } int main() { int Case,ii,i,n; char str[101]; scanf("%d",&Case); while(Case--) { scanf("%d",&n); mark=0; top=0; memset(data,0,sizeof(data)); for (ii=1;ii<=n;ii++) { scanf("%s",str); printf("Operation #%d: ",ii); if (strcmp(str,"Add")==0) Add(); if (strcmp(str,"Close")==0) Close(); if (strcmp(str,"Chat")==0) Chat(); if (strcmp(str,"Rotate")==0) Rotate(); if (strcmp(str,"Prior")==0) Prior(); if (strcmp(str,"Choose")==0) Choose(); if (strcmp(str,"Top")==0) Top(); if (strcmp(str,"Untop")==0) Untop(); } if (top!=0 && data[top].x!=0) { printf("Bye %d: %I64d\n",data[top].p,data[top].x); data[top].y=1; } for (i=1;i<=mark;i++) if (data[i].y==0 && data[i].x!=0) printf("Bye %d: %I64d\n",data[i].p,data[i].x); } return 0; } 
    
   
  


?

?