zoukankan      html  css  js  c++  java
  • hdu 5071(2014鞍山现场赛B题,大模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5071

    思路:模拟题,没啥可说的,移动的时候需要注意top的变化。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int MAX_N = (5000 + 500);
    struct Girl {
        int priority;
        __int64 words;
        Girl() {}
        Girl(int _priority, __int64 _words) : priority(_priority), words(_words) {}
    };
    
    struct Queue {
        int len, top;
        struct Girl girl[MAX_N];
    
        void Init() {
            len = 0;
            top = -1;
        }
    
        void Add(int u) {
            int tag = 0;
            for (int i = 0; i < len; ++i) {
                if (girl[i].priority == u) {
                    tag = 1;
                    break;
                }
            }
            if (tag) {
                puts("same priority.");
                return;
            }
            girl[len++] = Girl(u, 0);
            puts("success.");
        }
    
        void Close(int u) {
            int pos = -1;
            for (int i = 0; i < len; ++i) {
                if (girl[i].priority == u) {
                    pos = i;
                    break;
                }
            }
            if (pos == -1) {
                puts("invalid priority.");
                return;
            }
    
            printf("close %d with %I64d.
    ", girl[pos].priority, girl[pos].words);
    
            if (top != -1) {
                if (top == pos) top = -1;
                else if (top > pos) top--;
            }
    
            for (int i = pos + 1; i < len; ++i) {
                girl[i - 1] = girl[i];
            }
            --len;
        }
    
        void Chat(int w) {
            if (len == 0) {
                puts("empty.");
                return;
            }
    
            puts("success.");
    
            if (top == -1) {
                girl[0].words += (__int64)w;
            } else
                girl[top].words += (__int64)w;
        }
    
        void Rotate(int x) {
            if (x < 0 || x >= len) {
                puts("out of range.");
                return;
            }
    
            puts("success.");
            if (top != -1) {
                if (top == x) top = 0;
                else if (top < x) top++;
            }
    
            Girl tmp = girl[x];
            for (int i = x; i > 0; --i) girl[i] = girl[i - 1];
            girl[0] = tmp;
        }
    
        void Prior() {
            if (len == 0) {
                puts("empty.");
                return;
            }
    
            puts("success.");
            int max_priority = -1, pos = -1;
            for (int i = 0; i < len; ++i) {
                if (girl[i].priority > max_priority) max_priority = girl[i].priority, pos = i;
            }
            if (pos > 0) {
                if (top != -1) {
                    if (top == pos) top = 0;
                    else if (top < pos) top++;
                }
    
                Girl tmp = girl[pos];
                for (int i = pos; i > 0; --i) {
                    girl[i] = girl[i - 1];
                }
                girl[0] = tmp;
            }
        }
    
        void Choose(int u) {
            int pos = -1;
            for (int i = 0; i < len; ++i) {
                if (girl[i].priority == u) {
                    pos = i;
                    break;
                }
            }
            if (pos == -1) {
                puts("invalid priority.");
                return;
            }
    
            puts("success.");
            if (top != -1) {
                if (top == pos) top = 0;
                else if (top < pos) top++;
            }
    
            Girl tmp = girl[pos];
            for (int i = pos; i > 0; --i) girl[i] = girl[i - 1];
            girl[0] = tmp;
        }
    
        void Top(int u) {
            int pos = -1;
            for (int i = 0; i < len; ++i) {
                if (girl[i].priority == u) {
                    pos = i;
                    break;
                }
            }
            if (pos == -1) {
                puts("invalid priority.");
                return;
            }
    
            puts("success.");
            top = pos;
        }
    
        void Untop() {
            if (top == -1) {
                puts("no such person.");
                return;
            }
    
            puts("success.");
            top = -1;
        }
    
        void Bye() {
            if (top != -1 && girl[top].words > 0) {
                printf("Bye %d: %I64d
    ", girl[top].priority, girl[top].words);
            }
    
            for (int i = 0; i < len; ++i) {
                if (i != top && girl[i].words > 0) {
                    printf("Bye %d: %I64d
    ", girl[i].priority, girl[i].words);
                }
            }
        }
    } que;
    
    int N, u, w, x;
    char str[22];
    
    int main()
    {
        int cas;
        scanf("%d", &cas);
        while (cas--) {
    
            scanf("%d", &N);
    
            que.Init();
    
            for (int i = 1; i <= N; ++i) {
                scanf("%s", str);
    
                printf("Operation #%d: ", i);
                if (strcmp(str, "Add") == 0) {
                    scanf("%d", &u);
                    que.Add(u);
                } else if (strcmp(str, "Close") == 0) {
                    scanf("%d", &u);
                    que.Close(u);
                } else if (strcmp(str, "Chat") == 0) {
                    scanf("%d", &w);
                    que.Chat(w);
                } else if (strcmp(str, "Rotate") == 0) {
                    scanf("%d", &x);
                    que.Rotate(x - 1);
                } else if (strcmp(str, "Prior") == 0) {
                    que.Prior();
                } else if (strcmp(str, "Choose") == 0) {
                    scanf("%d", &u);
                    que.Choose(u);
                } else if (strcmp(str, "Top") == 0) {
                    scanf("%d", &u);
                    que.Top(u);
                } else if (strcmp(str, "Untop") == 0) {
                    que.Untop();
                }
            }
    
            que.Bye();
        }
        return 0;
    }
    


  • 相关阅读:
    DirectX9:基础篇 第六章 颜色
    DirectX9:应用篇 论OBJ模型文件格式
    MFC:绘图基础
    DirectX9:基础篇 纹理
    DirectX9:应用篇 论OBJ模型文件和.X模型文件互转
    MFC:控件位置调整
    数据结构:二叉树
    DirectX9:总结篇 数据类型结构
    C89:论结构体/枚举体/联合体的使用
    css布局汇总
  • 原文地址:https://www.cnblogs.com/wally/p/4477045.html
Copyright © 2011-2022 走看看