首页 > 其他分享 >关于贪心策略的一些小trick

关于贪心策略的一些小trick

时间:2022-10-09 08:00:07浏览次数:73  
标签:选择 策略 int trick 最优 莉雅 我们 贪心

为什么要写这种如此简单的东西呢 就是因为菜啊

首先给出关于贪心的三个定义

符合贪心选择的特性(Greedy Choice Property)

我们需要证明我们的第一个选择(贪心选择 Greedy Choice,First Choice)包含在某些最优解中

符合归纳法结构(Inductive Structure)

我们需要证明第一个选择(贪心选择)之后,子问题和原问题还是同一类问题,意味着我们的选择不改变问题的结构,
并且子问题的解可以和第一个选择(贪心选择)合并

最优子结构(Optimal Substructure)

如果我们可以最优的解决子问题,我们可以将子问题的解和贪心选择得到原问题的解
(以上摘自\(CSDN\)博主小郭(ω)

先谈谈我自己的理解

上面的专业术语看着都应该头大才对,那怎么说会让它变得简单一些呢,我们从一个简单地例子来解释上面的第一条和第三条。
现在\(Overwatch2\)非常火,众所周知,许多英雄都被大改,比如原版查莉雅有两个盾,一个只能套给自己,一个只能套给队友,两个分开冷却;现在的查莉雅可以存两个盾,每个盾可以选择套给自己,也可以套给队友,两个盾共享冷却(注意可以存两个)。那么现在和原来哪种查莉雅更强呢?很明显是当前版本的更强,我们尝试用贪心的思路来证明一下:
搬出我么喜闻乐见的反证法:假设当前版本并不比之前的强,那么对于之前的版本,查莉雅最多可以做到同时给自己和队友套盾,而当前版本的查莉雅显然也可以做到,这便是“我们需要证明我们的第一个选择(贪心选择 Greedy Choice,First Choice)包含在某些最优解中”,不仅当前版本的查莉雅包含于我们假设的最优解(之前的版本),她还可以做到给两个队友套盾或者连续给自己套两个盾,也就证明了现在版本的查莉雅至少不会比我们假设为更优的之前版本的查莉雅更差,这就体现了一种包含关系。
如何理解第三条呢,很简单,对于我们套出的每一个盾,新版都能做到和老版一样,并且还可以做出更灵活的操作,这就是“如果我们可以最优的解决子问题,我们可以将子问题的解和贪心选择得到原问题的解”
至于第二条嘛。。反正我没有看懂。

来个例子 P3942 将军令

题意就不赘述了,在这个题里面我们采用每次找深度最深的点的第\(k\)个父亲,这种贪心策略是正确的,且看下图image
三角形表示一棵很大的子树,图中深度关系已大致体现
这时我们取出最深的\(E\),我们要求的\(k\)为\(5\),那么按照贪心策略找到的父亲节点就是\(I\),我们来证明一下这个贪心策略是正确的:
假设我们往上找\(k\)个父亲不是最优的,最优解应选择同样距离\(E\)点距离为\(5\)的\(J\)点,假设\(K,L\)的深度是与\(E\)相同的,那么毫无疑问的是我们假设的最优解一定可以覆盖整个三角形子树,而\(I\)可以覆盖到\(E\)的深度,所以他也能一样覆盖到三角形子树,这时我们就证明到了贪心策略是包含在某个最优解中的了,但是对于\(I\)的右子树来说,\(J\)一定会比\(I\)少覆盖两个深度的点,因为\(J\)还需要花费两个距离的代价来到达\(I\),多假设几个最优解的点,你会发现对于一个这样的树形结构,我们的贪心策略至少不会比假设的最优解差,这时我们就可以放心的使用贪心来解决这道题了。
每次找到一个点,往他的周围暴力扩展\(k\)个点,再维护一个以深度为第一关键字的优先队列就差不多能够解决了,如果真的想不出正解或者打不出\(dp\)这种高级做法,可以大胆地使用自己认为正确并且举不出反例的的贪心,毕竟\(OI\)并不在于让你证明某个结论,再贴个代码吧

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
template <typename T>inline void re(T &x) 
{
	x=0;
	int f=1;
	char c=getchar();
	for(;!isdigit(c);c=getchar()) if(c=='-') f=-f;
	for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^48);
	x*=f;
	return;
}
int n,k,t,cnt;
struct Edge{int u,v,nex;}E[maxn];
int tote,head[maxn];
void add(int u,int v)
{
	E[++tote].u=u,E[tote].v=v;
	E[tote].nex=head[u],head[u]=tote;	
}

int fa[maxn];
int dep[maxn],vis[maxn];
struct node{int x,dep;};
bool operator <(node a,node b){return a.dep<b.dep;}
priority_queue<node> q;
void dfsbasic(int x)
{
    for(int i=head[x];i;i=E[i].nex)
	{
        int v=E[i].v;
        if(dep[v]) continue;
		fa[v]=x;dep[v]=dep[x]+1;
    	dfsbasic(v);
    }
    q.push((node){x,dep[x]});
}
int f(int x){for(register int i=1;i<=k;++i){x=fa[x];if(x==1)return 1;}return x;}
void dfsupd(int x,int fa,int com)/*x,x,0*/
{
	if(com==k+1)return ;
	if(!vis[x])vis[x]=1,cnt++;
	for(register int i=head[x];i;i=E[i].nex)
	{
		int v=E[i].v;
		if(v==fa)continue;
		dfsupd(v,x,com+1);
	}
}
int main()
{
	re(n),re(k),re(t);
	int u,v;
	for(register int i=1;i<n;++i)
	{
		re(u),re(v);
		add(u,v),add(v,u);
	}
	int rep=1;
	dep[rep]=1,fa[rep]=rep,dfsbasic(rep);
	int pick=0;
	while(!q.empty())
	{
		node tmp=q.top();q.pop();
		int x=tmp.x;
		if(vis[x])continue;
		int sfa=f(x);
		dfsupd(sfa,sfa,0);
		pick++;
		if(cnt==n)break;
	}
	printf("%d",pick);
	return 0;
}
	

标签:选择,策略,int,trick,最优,莉雅,我们,贪心
From: https://www.cnblogs.com/Hanggoash/p/16770405.html

相关文章

  • id生成策略
               ......
  • 医学影像人工智能实战(四):图像预处理的tricks
    1.空洞填充参考python-opencv去除小面积区域/孔洞填充(二值图像)2.根据连通区域去除假阳性参考深度学习,分割后处理之通过连通成分分析去除假阳性区域,提高分割准确度3.......
  • 浅谈前端常用设计模式之一:策略模式
    前言2022年,前端技术依旧日新月异,各种新兴技术或业务解决方案层出不穷。但我始终认为,在变与不变之间,唯有经典永恒,设计模式就是经典之一。在笔者从业期间,见过很多不同人写......
  • 深度学习刷SOTA有哪些trick?
    深度学习刷SOTA有哪些trick?【写在前面】对深度学习而言,不论是学术研究还是落地应用都需要尽可能提升模型效果,这往往需要trick进行支撑。这些trick有的是广泛适用的(如循环学......
  • 设计模式系列1 - 模板模式&策略模式
    分别讲述模板模式和策略模式的使用姿势,以及两者的区别,基于java。往期精选(欢迎转发~~)Java全套学习资料(14W字),耗时半年整理消息队列:从选型到原理,一文带你全部掌握肝了......
  • 策略模式的多种实现
    最近几天好好补了下血,才恢复了点精力。所以有了一点写些啥的欲望,那就写一下设计模式好了。 设计模式,相信大家应该都或多或少的接触过。总的来说,设计模式是一些前辈们在......
  • CF1415D XOR-gun 题解 二分答案/贪心
    题目链接https://codeforces.com/problemset/problem/1415/D题目大意给定一个长为\(n\)的不降序列,每次操作可以任选相邻的两个数,并将这两个数替换为两个数按位异或的......
  • [答疑]把查看日志作为一个用例,配置策略做为另一个用例
    ​​软件方法(下)分析和设计第8章分析之分析类图——知识篇(20211227更新)​​​​软件方法(下)分析和设计第9章分析之分析类图——案例篇(20211228更新)​​问题时间:2013/10/25......
  • SpringMVC之内容协商策略
    内容协商原理目录内容协商原理一、引言二、正常请求请求数据格式确定和返回值数据格式确定三、内容协商确定客户端接收数据格式默认基于请求头确定请求数据格式确定服务端......
  • 反悔贪心
    一.什么是反悔贪心顾名思义,反悔贪心就是两个操作:“反悔”+“贪心”。一般来说,贪心仅能解出局部最优解。那么在要求全局最优解时,我们就可以利用“反悔”这个操作解决。......