• Codeforces #1063C Dwarves, Hats and Extrasensory Abilities


    题目大意

    交互题。
    输出平面上的一个点的坐标,交互程序给这个点染色(白或黑)。
    如此重复 $n$ 次($ 1le n le 30$)。
    要求输出的 $n$ 个点各不相同,并且不论交互程序怎样给它们染色,都能找到一条直线将白点和黑点隔开(分隔线不能通过染色的点)。
    输出分隔线上的两个点的坐标。

    要求:输出的所有坐标都必须是 $0$ 到 $10^9$ 之间的整数。

    解法

    不难想到可以将 $n$ 个点都选在一条平行于 $x$ 轴的直线上。

    每次都取中间两个相邻的黑白点的连线的中点。
    (Put a new point in the middle of the gap between white points and black points. Depending on the color said by jury shrink the gap to the left or to the right. In the end, draw a diagonal line between white points and black points.)

    由于纵坐标是一个常数,下面我们只考虑横坐标。

    将第一个点的(横)坐标选为 $0$,不妨设第一个点被赋予白色,此时我们假想 $10^9+1$ 处是一个(虚拟的)黑点。
    每次选取相临的两个黑白点连线的中点 $ l + (r - l) / 2$ 或者 $(l+r)/2$(注意:这种写法有溢出的风险)。

    比赛时我的思路大体是对的,只是在最后输出分隔线时,我选择的是垂直于 $x$ 轴的直线,令其与 $x$ 轴交于 $(l + 1, 0)$,$l$ 是最右侧的白点的横坐标。

    但是我没考虑到一种情况,那就是中间相邻的那两个黑白点的距离有可能是 $1$(这是由于 $2^{30} > 10^9+1$ 。实际上,若令 $x = 10^9 + 1$,将 $xgets lceil x /2 ceil$ 反复执行 $29$ 次,必然有 $x = 1$;将 $x gets lfloor x/2 floor$ 反复执行 $29$ 次也必然有 $x = 1$),此时分隔线恰经过最左侧的黑点。容易看出,分隔线若与 $x$ 轴垂直就在黑白点所在的水平线上占了一个位置(总共有 $10^9 + 1$ 个位置)。我们完全可以选择一条直线作为分隔线,由于最后必然有 $l < r$,我们可以令黑白点的纵坐标为 $1$,这样分隔线就可取为通过 $(l, 0)$ 和 $(r, 2)$ 两点的直线。

  • 相关阅读:
    pandas高效实现条件逻辑
    Python教程:文件、异常处理和其他
    最终初学者指南,以数据科学用例赢得分类黑客马拉松
    用Nvidia Jetson Nano 2GB和Python构建一个价值60美元的人脸识别系统
    一幅图像能顶16x16字!——用于大规模图像缩放识别的变压器(对ICLR 2021年论文的简要回顾)
    接缝雕刻算法:一种看似不可能的图像大小调整方法
    apache与nginx的优缺点的比较
    php5与php7的区别
    git基本的命令大全
    redis和membercache的区别
  • 原文地址:https://www.cnblogs.com/Patt/p/9788712.html
Copyright © 2020-2023  润新知