• constructive algorithms collections


    坚持更新QAQ

    1:cf773 div2 C

    题意:有n个数及乘积x,问最少添加多少数,保证最后可以全部两两一对(a1*x==a2)

    思路:贪心策略,排序后从大到小看是否有满足/x的数,没有就cnt+1,有的话就删掉对应的数字

    2:[USACO2004OPEN]The Cow Lineup

    题意:总序列有n个数,每个数为1~k。子序列只要有前后顺序存在即可。想找出一个最短的子序列,使之不在总序列里出现,求其最短长度。

    思路:模拟,当一段子序列的数字种类达到k时,len++。然后最后+1就是所求的答案,即再加一个数字则是不存在的子列。

    3:NOIP2012提高组 国王游戏

    题意:每个人有左右两个数,第一个人固定,后面顺序任调,每个人获得金额为前面的人左边的数的乘积除以自已右边的数,使所有人的金额最大值最小

    思路:抛开高精度不说,主要讲贪心策略:通过邻项交换比较可得最优策略按(左边数×右边数)从小到大排序.

    4:CF1012A Photo of The Sky

    题意:有n个打乱的点的x,y轴坐标(坐标点x,y都被打乱)共2*n个值,问最小的矩形面积能覆盖住n个点且矩形长和宽分别与x,y轴平行

    思路:模拟,要分两种情况,坐标分为x轴和y轴后:情况一为最大值和最小值在同一轴,则另一轴的极差要极可能小;情况二为最大值和最小值在不同轴,则要使两轴内的极差尽可能小

    5:CF1087D Minimum Diameter Tree

    题意:一颗n个点树,将总权值k分配给每条边,求最小直径

    思路:贪心考虑极端情况,让任意两个叶节点之间的路径权值和的最大值最小,设l为叶子数,由"树的直径的特点+贪心的想法即均摊边权",得到答案为 n / l * 2.0

     6:2021文远知行杯E 贝壳

    题意:n个数的数组,q次询问编号为区间[l,r]的数组中,x的倍数有几个

    思路:用vector预处理各数字的倍数有谁,排序,答案为upper_bound(pool[x].begin(),pool[x].end(),r)  - lower_bound(pool[x].begin(),pool[x].end(),l)

    7:CF778C Alice and the Cake

    题意:一个数平分成两个数(向上取整和向下取整),做任意次分割,问最后是否能成为给定的n个数

    思路:用两个排序好的数组来维护,一个来维护总和怎么平分的数,一个来维护给定的数,若总和的最大值比给定的数的最小值还小则输出NO

     8:Educational Codeforces Round 121C Monsters And Spells

    题意:n只怪物出现时间为ki和血量hi,蓄力释放魔法的伤害为x+1or1(x为上次的伤害),只有伤害大于血量时才能一口气杀死怪兽,求最少需要造成多少伤害

    思路:每个怪造成的伤害为[hi-ki+1, hi],转换为区间合并问题

    9:Educational Codeforces Round 125C Bracket Sequence Deletion

    题意:长度为n有 ‘(’ 和‘ )’ 组成的字符串,若前缀和符合 ()个数相等刚刚好,或前缀为回文,则操作次数+1,删掉符合条件的最短前缀和继续扫描,直至不符合上诉操作,求操作次数和剩余个数

    思路:模拟+贪心思考,(的后一个不管是什么都要操作删除;而)下一个若为)也直接删除,只有下一个是(时,直到字符结束都没有)才会break;时间复杂度不到O(tn)

    吐槽:我是个傻子,写了个函数判断() regular,然后再用hash判断回文的模板没准备 现场调了半天,最后还tle

     10:CF776 div3D Twist the Permutation

    题意:有n个数从头到尾分别为1~n,每次操作能将任意一个数调到最前,其它数往右挪一个位置,问每个位置操作几次 能通过最少总操作次数到达目标数

    思路:模拟,前面的数进行操作不会对后面的数造成影响,从最后一个开始复位进行了x次操作,然后其前面的数也会跟着减少x次。

    吐槽:正男则反的思路有点像一道BIT的经典题。。

     11:CF1656D K-good

    题意:一个数n(n>=2)能否分解成k(k>=2)个不同的数的和,若能则输出分解的个数(合法即可)

    思路:n若为奇数则必定可以分解成两个;若n为偶数,则n≡k(k+1)/2 (mod k),而(k+1)mod k == 1<即 n≡k/2(mod k),得n=k/2+tk(t为任意自然数),则只有i^2不能分解;即 n=q*2^k,比较q和    k+1(此时k+1即为2^k)大小可知

    吐槽:我以为是二进制分解然后误打误撞得到 i^2不能分解(以后也可以打表?);但这时候难点反而落在了分解的次数,应为while(n%2==0) {n/= 2;k*=2;}

  • 相关阅读:
    windows 7 wifi热点配置
    Java中的try catch finaly先后调用顺序
    redis php扩展
    mysql索引
    cmd操作数据库的常用命令
    php ajax解决跨越问题
    git常用命令
    php,redis分布式锁防并发
    php商城下单,可以购买多件商品,redis防高并发
    php商城秒杀,redis防高并发
  • 原文地址:https://www.cnblogs.com/EvfX/p/15938240.html
Copyright © 2020-2023  润新知