[NOIP2022] 喵了个喵 题解

[NOIP2022] 喵了个喵

P 1 :   k = 2 n − 2 P1:\space k=2n-2 P1: k=2n2 的情况

  • 我们将 n n n 个栈分为 n − 1 n-1 n1普通栈 和一个 机动栈
  • 极端情况下,每个 普通栈 有两张不同种类的牌

[NOIP2022] 喵了个喵 题解_第1张图片

  • 对于一张新来的牌 X X X
    X X X B , D , F B,D,F B,D,F 中的一种,即 X X X 之前出现过在栈顶,应将 X X X 放入所对应的栈的栈顶
    X X X A , C , E A,C,E A,C,E 中的一种,即 X X X 之前出现过在栈底,应将 X X X 放入 机动栈 ,并与所对应的栈消除底部

  • X X X A , C , D , E , F A,C,D,E,F A,C,D,E,F 均不同,即 X X X 之前没出现过,此时 普通栈 一定有空位
    [NOIP2022] 喵了个喵 题解_第2张图片

  • 对于一张新来的牌 X X X ,放入任意一个空缺的栈即可


P 2 :   k = 2 n − 1 P2:\space k=2n-1 P2: k=2n1 的情况

[NOIP2022] 喵了个喵 题解_第3张图片

  • 该情况对于未出现的牌比 k = 2 n − 1 k=2n-1 k=2n1 时多一种情况:
    • 如图,在 普通栈 中均放入两张牌之后,还会有一种未出现过的牌 G G G

    • 而仅仅根据 G G G 无法确定 G G G 应放入栈的位置,我们需要根据 G G G 后方的牌来确定

    • [NOIP2022] 喵了个喵 题解_第4张图片

    • G G G 后方跟的牌为 A A A ( C , E C,E C,E 同理) ,决策为将 G G G 放入 2 2 2 号栈,然后将 A A A 放入 机动栈 并与 2 2 2 号栈消除栈底的牌

    • G G G 后方的牌为 B B B ( D , F D,F D,F 同理) ,由于题目保证存在有解,因此在出现若干张栈顶牌后,一定会出现栈底牌,例如 : G , B , D , A G,B,D,A G,B,D,A G , B , D , E G,B,D,E G,B,D,E


  • G , B , D , A G,B,D,A G,B,D,A
    [NOIP2022] 喵了个喵 题解_第5张图片

  • 此情况在出现栈底元素之前,该栈底所对应的栈顶牌出现了奇数次 (无法自己消掉),则应将 G G G 放入机动栈

  • 在所有操作之后,机动栈 变为 栈底元素所在的栈


[NOIP2022] 喵了个喵 题解_第6张图片

  • 此情况在出现栈底元素之前,该栈底所对应的栈顶出现了偶数次 (此例为 0 次),则应将 G G G 放入栈底牌所对应的栈
  • 此情况在所有操作后, 机动栈 不变

总结

  • 对于新来的一张牌 X X X
  • X X X 出现过
    • 之前出现在栈顶 — X X X 放入对应栈
    • 之前出现在栈底 — X X X 放入机动栈
  • X X X 未出现过
    • 有空缺 — 放入任意空缺栈
    • 无空缺
      • 栈底牌对应栈顶牌出现奇数次 — X X X 放入机动栈机动栈 变为这个栈
      • 栈底牌对应栈顶牌出现偶数次 — X X X 放入这个栈

  • 模拟一组简单的样例:
    [NOIP2022] 喵了个喵 题解_第7张图片

你可能感兴趣的:(题解,c++,学习)