• 【codeforces 794C】Naming Company


    【题目链接】:http://codeforces.com/contest/794/problem/C

    【题意】

    有n个位置;
    两个人;
    每个人都有n个字符组成的集合s1,s2(可以有重复元素);
    然后两人轮流从各自的集合中取出一个字符;
    把它放在这n个位置中的任意一个位置;
    其中一个人想要让这n个字符组成的字符串字典序尽量小;
    另外一个人则想让他尽量大;
    问你最后字符串会变成什么样

    【题解】

    s1和s2是两个人的集合
    可以先把s1升序排;
    然后s2降序排;
    设ls1,ls2分别为s1和s2最左的边的未被选走的字符;
    rs1,rs2则是最右的;
    然后到第一个人选的时候
    比较s1[ls1]和s2[ls2];
    ①如果s1[ls1]< s2[ls2]
    则我们必须要把s1[ls1]尽可能地放在最后的字符串的最左边;
    因为如果你不占据最左边那个位置的话;
    s2[ls2]那个最大的就能放在最左边那个位置了;
    而这无疑给了对手把字符的字典序变大的机会;

    如果s1[ls1]>=s2[ls2];
    这个时候;
    就相当于是这样的情况
    x y z
    c b a
    即s1里面的每一个字符的字典序都比s2里面的来得大;
    则,这个时候;
    我们就不能着急着把x放在开头了;
    应该机灵一点;
    先看看自己还能放几个字符;
    然后尽量把自己的,字典序大的放在最后面;
    (让那些字典序大的占的位权小一点)
    然后就能逼迫对方把较小的字符放在最开头了:)
    比如当前你还能放两个字符(知道还能放两个字符的作用就在于此,不然你会错误地选择最后一个字符z放在最后面,而实际上最后一个字符放y比较优)
    则你先把y放在最后面,然后再考虑对方会怎么做?,对方也应该会执行这样的策略,即也看看自己还能放多少个字符x,然后把第ls2+x-1个字符放在最后面,即,尽量把字典序小的字符放在后面,让字典序小的字符的位权占的少一点,逼迫对方让对方把大字典序的字符放在前面;
    所以一旦遇到②的情况,其实就能直接出结果了;
    每个人都从令x=ls+自己能放的字符个数-1个字符开始,轮流把x,x-1,x-2…放在最后的答案字符的末端.

    【Number Of WA

    8

    【完整代码】

  • 相关阅读:
    CentOS安装KDE
    __builtin_expect — 分支预测优化
    Linux中CPU亲和性(affinity)
    字节序
    gethostbyname
    字符串搜索算法
    排序算法
    Linux下使用http协议下载文件
    POSIX Timer
    POSIX-Data Structure
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626319.html
Copyright © 2020-2023  润新知