HDU 5071 Chat

2015-01-27 18:12:18 · 作者: · 浏览: 31

题意:

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