zoukankan      html  css  js  c++  java
  • CF

    $ ext{A. Prefixes}$

    题意:

      给定一个序列,只包含 $a$ 或者 $b$,现在要修改这个序列,使得这个序列的长度为偶数的前缀子串中,$a$ 的个数和 $b$ 的个数一样多。

      序列长度不超过 $2*10^5.$

    解析:

      这道题,表面上很困难,实际只需要这么想:

      我们只需要每两个字符检查一次,如果这两个字符相同那么就将其中一个改成另一种字符即可。

      复杂度 $O(n).$

    $ ext{B. Shotting}$

    题意:

      你有一个长度为 $n$ 的序列 $A$,即 $A_1,A_2,...,A_n.$

      现在,请重新给序列 $A$ 排序,使得 $large{sum}{^n_{i=1}(i-1)*A_i+1}$ 最小。

      $1 le n,A_i le 10^3.$

    解析:

      我们发现序列中每一个数的权重是不同的,越前面的数权重越小。

      所以,我们想要让答案最小,那么一定要让大的数排在前面,小的数排在后面。

      这样,就可以得到正确答案了。

    $ ext{C. White Sheet}$

    题意:

      给定一张白纸和两张黑纸(均为矩形)的左下角、右上角的坐标,如果两张黑纸完全覆盖白纸,输出 $NO$,否则输出 $YES.$

      $0 le ext{每个点的坐标} le 10^6.$

    解析:

      首先我们可以想到,如果这张白纸可以被其中一张黑纸完全覆盖,那么肯定输出 $NO.$

      否则,若这两张黑纸无交集,肯定输出 $YES.$

      做完了?不可能!

      看这个图:

      

      其中,红色是白纸,青色是黑纸,紫色是黑纸的交集。

      我们发现,白纸置于如下绿色+紫色区域时,黑纸可以完全覆盖白纸,如下图:

      

      因此,我们只要分别判断白纸位于绿色区域就行了。

      判断方式,看白纸是否位于“横着”或“竖着”的任意一个绿色矩形。

    $ ext{D. Swords}$

    题意:

      有 $n$ 堆剑,每一堆有 $m$ 个剑。

      现在,有 $k$ 个人偷窃了这些剑,每一个人偷了相同数量的剑。

      给出每一堆剩余剑的数量 $A_1,A_2,...,A_n$,求出 $k$ 的最小值且求此时的 $m.$

      $0 le A_i le 10^9$,$1 le n le 2*10^5.$

    解析:
      这道题不保证答案具有单调性,所以不能用二分答案;

      然后,就试着用快速做法来解决。

      我们可以求得 $m=gcd{m-A_i}.$

      那么,如何快速求出 $m$ 呢?

      差分!

      用差分,就可以抵消掉 $m$,得到两个数的差。

      而且,如果 $x|A_i$,$x|A_j$,那么 $x|(A_i-A_j)$

      所以,这样就可以求出最小的 $m$,并且求出 $k$ 的最小值。

  • 相关阅读:
    python基础学习1-函数相关
    python基础学习1-SET 集合
    Linux命令学习笔记1
    python基础学习1-字典的使用
    python基础学习1-列表使用
    Jzoj4743 积木
    Jzoj4786 小a的强迫症
    Jzoj4746 树塔狂想曲
    Jzoj5246 Trip
    Jzoj5245 Competing Souls
  • 原文地址:https://www.cnblogs.com/zengpeichen/p/11565378.html
Copyright © 2011-2022 走看看