HDU 5071 Chat

题意:

CLJ找了许多妹子…  (题目好没节操…)  对于CLJ和妹子的聊天对话框  有一下几种操作:

add  加一个妹子在聊天窗队列末尾  如果这个妹子已经在队列中则add失败

close  关掉某个妹子的聊天窗口  如果没有这个妹子的对话框则close失败  如果成功要输出和这个妹子说过几个词

chat  和最前面妹子说一些话  如果没有窗口打开则chat失败

rotate  将某个妹子移到最前面  如果寻找妹子时发现超出队列范围则rotate失败

prior  将优先级最高妹子移到最前面  如果没有对话框则prior失败

choose  选择某个妹子移到最前面  如果该妹子不在队列则choose失败

top  选择某个妹子将她的状态变为总在最前  如果妹子不在队列则top失败  如果曾经有总在最前的妹子  则取代之

untop  撤销总在最前状态  如果没人总在最前则untop失败

最后按照队列顺序  与每一个曾经说过话的妹子道别

思路:

模拟题…  写写写…

总在最前是一种状态  要理解  它并不直接改变队伍形状

即  第三个妹子被top  再被untop  这时这个妹子依然站在第三个位置上

注意几个坑点:

close时候可能关掉的是总在最前的妹子的对话框  这时总在最前也同时消失

chat要用__int64存储每个妹子对话过几个词

最后道别时候应该先于总在最前的妹子道别

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<bitset>
using namespace std;
typedef __int64 LL;
#define M 5010

struct girl {
    int prior;
    LL word;
} g[M];
int T, n, tot, alwaysontop;

int main() {
    int i, u, j, success, w, x;
    char op[30];
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &n);
        tot = 0;
        alwaysontop = -1;
        for (i = 1; i <= n; i++) {
            printf("Operation #%d: ", i);
            scanf("%s", op);
            if (strcmp(op, "Add") == 0) {
                scanf("%d", &u);
                success = 1;
                for (j = 0; j < tot; j++) {
                    if (g[j].prior == u) {
                        success = 0;
                        break;
                    }
                }
                if (success) {
                    printf("success.\n");
                    g[tot].prior = u;
                    g[tot].word = 0;
                    tot++;
                } else
                    printf("same priority.\n");
            } else if (strcmp(op, "Close") == 0) {
                scanf("%d", &u);
                success = 0;
                for (j = 0; j < tot; j++) {
                    if (g[j].prior == u) {
                        success = 1;
                        u = j;
                        break;
                    }
                }
                if (success) {
                    if (g[u].prior == alwaysontop)
                        alwaysontop = -1;
                    printf("close %d with %I64d.\n", g[u].prior, g[u].word);
                    for (j = u; j < tot; j++)
                        g[j] = g[j + 1];
                    tot--;
                } else
                    printf("invalid priority.\n");
            } else if (strcmp(op, "Chat") == 0) {
                scanf("%d", &w);
                if (alwaysontop != -1) {
                    for (u = 0; u < tot; u++) {
                        if (g[u].prior == alwaysontop) {
                            g[u].word += w;
                            break;
                        }
                    }
                    printf("success.\n");
                } else if (tot > 0) {
                    g[0].word += w;
                    printf("success.\n");
                } else
                    printf("empty.\n");
            } else if (strcmp(op, "Rotate") == 0) {
                scanf("%d", &x);
                if (x >= 1 && x <= tot) {
                    x--;
                    while (x) {
                        swap(g[x], g[x - 1]);
                        x--;
                    }
                    printf("success.\n");
                } else
                    printf("out of range.\n");
            } else if (strcmp(op, "Prior") == 0) {
                if (tot) {
                    u = 0;
                    for (j = 1; j < tot; j++) {
                        if (g[j].prior > g[u].prior)
                            u = j;
                    }
                    while (u) {
                        swap(g[u], g[u - 1]);
                        u--;
                    }
                    printf("success.\n");
                } else
                    printf("empty.\n");
            } else if (strcmp(op, "Choose") == 0) {
                scanf("%d", &u);
                success = 0;
                for (j = 0; j < tot; j++) {
                    if (g[j].prior == u) {
                        success = 1;
                        u = j;
                        break;
                    }
                }
                if (success) {
                    while (u) {
                        swap(g[u], g[u - 1]);
                        u--;
                    }
                    printf("success.\n");
                } else
                    printf("invalid priority.\n");
            } else if (strcmp(op, "Top") == 0) {
                scanf("%d", &u);
                success = 0;
                for (j = 0; j < tot; j++) {
                    if (g[j].prior == u) {
                        success = 1;
                        break;
                    }
                }
                if (success) {
                    alwaysontop = u;
                    printf("success.\n");
                } else
                    printf("invalid priority.\n");
            } else if (strcmp(op, "Untop") == 0) {
                if (alwaysontop != -1) {
                    alwaysontop = -1;
                    printf("success.\n");
                } else
                    printf("no such person.\n");
            }
        }
        if (alwaysontop != -1) {
            for (j = 0; j < tot; j++) {
                if (g[j].prior == alwaysontop) {
                    u = j;
                    break;
                }
            }
            if (g[u].word)
                printf("Bye %d: %I64d\n", g[u].prior, g[u].word);
        }
        for (j = 0; j < tot; j++) {
            if (g[j].word && g[j].prior != alwaysontop) {
                printf("Bye %d: %I64d\n", g[j].prior, g[j].word);
            }
        }
    }
    return 0;
}


你可能感兴趣的:(HDU,杂题)