程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 5071 Chat

HDU 5071 Chat

編輯:C++入門知識

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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved