zoukankan      html  css  js  c++  java
  • 8.08 贪心

    T1

    问题

    给你一个长度为n的数字,可以删掉其中的m位,使得结果数字最小.

    解法

    • 首先考虑m = 1的情况.此时我们为了降低字典序,显然要从前往后找到第一个下降的数字,然后删掉它.这样起到了降低字典序的效果.然后考虑一般情况,其实相当于m次这个过程.这体现了贪心的核心:单步最优解导致全局最优解.
    • 我们删去了m个数字,这些数字也可以组成一个序列.如果当前贪心不是最优解,那与最优解相比,肯定与最优解相比至少会有一对数,在原序列中位置不同.如果当前贪心删去的数字位置在最优解的后面,那就说明最优解比贪心删去的数字小或者相等,显然这样的话我们删去最优解更优而不是删去当前贪心的位置.同样,如果在前面也可以证明我们的贪心就是最优解.
    • 该问题也可以转化为取出序列中的n-m个数字.那么贪心策略就是在前m+1位中选最小值,然后前面删掉.然后重复这个过程.因为只需要保证最后有足够的数可以选就行了,所以选第一个时,只要保证最后有至少n-m-1个数就行了.以此类推.

    T2

    问题

    给你一个长度为n的序列,其中的0可以视为任何正整数,求它的最长上升子序列.

    解法

    设dp[i]表示以a[i]结尾的lis的长度.(a[i]!=0)
    dp[i] = max{dp[j]} + 1,其中a[i]-a[j]>x(x为[i,j]之间0的个数).
    0的个数可以用前缀和优化.

    T3

    问题

    给出一个长度为n的序列a,其中每个数都可以看做一个k位二进制数,你可以将序列中任意一个数按位取反,目标是使得其中异或和不为0的区间尽可能的多
    n<=2e5,k<=30

    解法

    区间的异或和可以转化成前缀和问题,xorsum[i,j] = sum[j] xor sum[i - 1].........

    T4

    问题

    给出一些边,选出四条边组成矩形,最小化周长的平方与面积的商.

    解法

    众所周知,周长确定的情况下,越接近正方形面积越大,所以就选择最接近的两条边就好啦.

    具体证明的话,就表示成a / b + b / a最小,也就是x + 1 / x最小,由双钩函数的性质可以知道,比例越接近1越合适.

    T5

    问题

    给定一个n个节点的树,点权是2^i,现在在保证连通性的情况下,从树中删去k个点,最大化剩余节点点权和.
    1e6,3s.

    解法

    显然点i的权值比Σa[1,i-1]还要大.所以我们选择n号点作为根,然后贪心地判断n-1,n-2..能不能被保留.

  • 相关阅读:
    uva11059
    uva725
    程序中double类型的数输出为什么要用lf
    c++形参和实参同名时,如何单步执行观察形参的变化。
    台式机的字母键和数字键都不能正常使用了呢?
    找错误——下面的程序意图在于统计字符串中字符数1的个数,可惜有瑕疵
    初学者常见错误1——赋值时的类型转换
    scanf
    c++的调试与运行
    黑猫派对
  • 原文地址:https://www.cnblogs.com/i-cookie/p/11383876.html
Copyright © 2011-2022 走看看