首页 > 其他分享 >「贪心」做题记录

「贪心」做题记录

时间:2024-11-12 22:18:58浏览次数:1  
标签:疲劳 可以 记录 dfs 住户 节点 贪心

「贪心」做题记录

  1. P2672 [NOIP2015 普及组] 推销员

    由于不会走多余的路,所以行走产生的疲劳值只和最远的被推销的住户有关。设 \(f_X(i)\) 表示总共选 \(X\) 家住户,且第 \(i\) 户是最远的被推销的住户的情况下,最大的疲劳值。显然可以贪心地在前 \(i-1\) 户中选择 \(X-1\) 户疲劳值最大的住户,所以 \(f_X(i) = 2S_i + A_i + 前(i-1)个A_j中最大的(X-1)个A_j的和\)。

    可以用小根堆(优先队列)维护前 \(k\) 大和。由于要枚举 \(X\),总的时间复杂度为 \(O(N^2\log N)\),可以得到 60 分。代码

    下面是本题的正解贪心做法。

    考虑贪心地选取前 \(X\) 个疲劳值最大的住户。但这并不一定是最优的:我们可能选取一个疲劳值更小,但比原来所有住户都更远的住户,从而通过行走距离获得更大的疲劳值。

    具体地,我们要放弃原先的多少个住户呢?实际上最多放弃 1 个,然后选择未被选择的住户中,\(2S_i+A_i\) 最大的住户 \(i\)。如果放弃多于 1 个住户,一定不优于只放弃 1 个。(不知道怎么表达证明过程)

    AC 代码

  2. [ABC137D] Summer Vacation

    如果一个工作在某一天做完之后,直到结束都不能领到工资,那么还不如不做。所以可以把一个工作可以做的区间看作一段前缀。从后往前枚举天数,维护可以做的工作的集合,每次选择集合中价值最大的工作来做。(不会严谨证明,但前缀的观点或许有助于理解。)

    提交记录

  3. [AGC004D] Teleporter

    洛谷的题解都他妈是什么东西?怎么都这么意识流,还有的是如写

    首先根据题目中图的性质,可以得出在忽略 \(1\) 出发的边以后,图一定是一棵以 \(1\) 为根的内向树。

    证明:删去 \(1\) 出发的边显然不影响其它点到 \(1\) 的可达性,这时边数 \(=\) 点数 \(-1\)。根据连通性,可以得知图是树。再根据除了 \(1\) 之外的点都可达 \(1\),可以得知图是以 \(1\) 为根的内向树。

    从树的角度来看,可以得出 \(1\) 必须指向自己。因为在树上两点的路径唯一,而且是内向树,如果一个点的深度小于 \(K\),并且没有这个自环,它就无法通过恰好 \(K\) 次传送到达 \(1\)。

    如果一个点的深度大于 \(K\),那么它显然无法经过恰好 \(K\) 次传送到达根节点;否则一定可以,缺少的部分可以通过一直走 \(1\) 的自环来补足。那么我们把问题转化成了:给定一棵树,修改最少的边,使得所有点的深度不大于 \(K\)。

    这个问题还可以进一步转化:删除最少的边,使得剩下的所有弱连通块(每个弱连通块都是树)都满足以下条件:

    • 如果根节点为 \(1\),那么树的高度不超过 \(K\)。
    • 否则,树的高度不超过 \(K - 1\)。

    采用 dfs ,自下往上解决此问题。如果一棵子树的高度大于等于 \(K - 1\),并且它的父节点不是 \(1\),那么需要删除它连向父节点的边,否则更新父节点的高度。

    function<void(int)> dfs = [&](int u)
    {
        h[u] = 0;
        for(int v: G[u])
        {
            dfs(v);
            if(u != 1 && h[v] == K - 1)
                ans++;
            else
                h[u] = max(h[u], h[v] + 1);
        }
    };
    dfs(1);
    

    这样得出来的图一定满足条件,但删边数的最少性不会证明。官方题解用的就是这个做法。

    完整代码

标签:疲劳,可以,记录,dfs,住户,节点,贪心
From: https://www.cnblogs.com/dengstar/p/18542786

相关文章

  • Illegal mix of collations for operation 'UNION' 记录错误
    24-11-12,在DVWA靶场练习回顾SQL注入union注入的时候突然发现,不管搞都报错!Illegalmixofcollationsforoperation'UNION'自己查了好久之后才发现是数据库编码不匹配的问题!!!union两端的字段的collatie(排序规则)不同参考:https://blog.csdn.net/qq_43665434/article/details/......
  • kubectl常用命令行记录
    以下是kubectl的常用的命令1、查看podkubectlgetpod-nnamespace上述命令行可查看该命名空间下的pod情况,信息展示的少,若想列表展示更多,可使用-owide指定输出方式,如下所示kubectlgetpod-nnamespace-owide注:namespace:命名空间2、查看svckubectlgetsvc-nnamespace同......
  • 浅谈贪心算法
    浅谈贪心算法贪心算法,指在问题求解时,每一步都做出“当前看起来最好的决策”。它没有固定的算法模板,灵活性强。在OI领域,无论是入门组,还是省选,NOI,或多或少都出过贪心题。可见贪心的重要性之大。使用贪心算法解决问题,必须满足“无后效性”。满足“无后效性”不一定当前的决策......
  • 好题记录 [集训队互测 2023] 优惠购物 题解
    首先发现这个过程的限制比较多,那么考虑重新描述这个过程。令\(x_i\)表示在第\(i\)个物品上使用了\(x_i\)张券,那么一组\(x_{1\simn}\)就描述了一个方案。方便起见,令\(s_i\)为前i个物品买完后剩了几张券,那么有:\(s_0=m\)\(s_i=s_{i-1}+\lfloor\frac{a_i-......
  • [考试记录] 2024.11.12 noip模拟赛11
    T1使用\(bfs\)记录走到\(tx,ty\)的路径的横边和竖边的数量,然后取\(\max\)。这里取\(\max\)的原因是,找到的路径必须是最短路,当\(k\)取的小的时候竖边就会变多,所以这条路径就不一定是最短路了。#include<bits/stdc++.h>usingnamespacestd;#defineppair<int,int>i......
  • 洛谷 P1772 [ZJOI2006] 物流运输 做题记录
    很神经的一道题。令\(val_{i,j}\)表示从第\(i\)天到第\(j\)天每天都走一条道路,单次的最小花费。可以枚举\(\{i,j\}\)然后把在这个区间里的所有点设置成不可达,每一个\(\{i,j\}\)都可以用floyd算,时间复杂度\(O(n^2m^3)\)。令\(f_i\)表示第\(i\)天的最小花费,那么......
  • 2024.11.12 NOIP模拟 - 模拟赛记录
    Preface一套烂题。T1一眼搬的CF(赛后十秒就找到原题了),只搬idea就算了,根本不设置部分分,大样例给的更是一坨(数据范围给的\(10^{15}\),121072121算什么大样例?),甚至最后的题解都是直接复制的洛谷。T2稍好,除了实数运算稍微恶心一点,其它都没什么。T3又是一大坨,不给SPJ都......
  • 删除重复id的记录
    数据里面,id重复,创建时间不同 --新建字段repete_flag--针对重复id的数据,打标记updateyg_gate_base_bsetrepete_flag='REPETE'WHEREidIN(selectidfromyg_gate_base_bgroupbyidhavingcount(*)>1) select*fromyg_gate_base_bwhererepete_flag=......
  • 国庆苏州行记录
    苏州行记录day1:网师园-平江路因为是中午到的苏州,只有半天玩的时间,所以开始就选了小巧而精致的网师园,以及靠近网师园的平江路网师园确实和别人描述的一样,小而精致,内部各个房屋靠的很紧,没有非常明确的主浏览道(对比拙政园)。但是相对缺点也比较明显,景色比较单一,如果纯游客,非园林......
  • MIT 操作系统实验问题记录
    Linux连接vscodeRemote-SSH设置:在实验环境搭建时只用官网提供的是不够的还需要安装在gitpush到远程仓库的过程中由于clone时用的是url=git://g.csail.mit.edu/xv6-labs-2020这个所以得创建一个新的分支来向远程仓库pushgitremoteaddgiteehttps://gitee.com/zhang......