A. Linova and Kingdom(dfs + 贪心)

news2024/11/19 3:31:59

A. Linova and Kingdom(dfs + 贪心)

  • 一、问题
  • 二、思路
  • 三、代码

一、问题

在这里插入图片描述

二、思路

这道题的大意就是,给我们一棵树,我们需要在树上选择 k k k个点,然后让 k k k个信使从我们选取的 k k k个点向第一个点出发。

我们把我们选取的k个点涂为黑色,剩下的点涂为白色。

我们从黑色点出发,如果经过白色的点,我们的快乐值就会加1,如果经过的黑色的点,我们的快乐值不变。

那么对于 k k k个点而言,在他们向第一个点出发的过程中,都会有一个属于自己的快乐值。

我们需要求出这些快乐值的和的最大值。

那么思路是什么呢?

如果不管路上的黑色点的话,我们要想快乐值很大的话,我们就需要选择深度最深的点,即从叶子节点开始选。

除此之外,我们需要观察出,在最优解中,如果一个点被选择了,那么他的子节点必定被选择。

为什么呢?

我们假设最优解中,存在一个点 i i i,我们选择了它,但是它的子节点中有一个没有被选。

我们从两个角度开始考虑。

这个子节点到根节点的距离肯定大于我们的节点 i i i到根节点的距离,因此,我们这个子节点的快乐值肯定是大于等于节点 i i i的快乐值的。(当且仅当 i i i和该子节点直接相连时,取到等号)

另外,由于我们选择了节点 i i i,所有节点 i i i中被选的子节点在经过 i i i的时候是不加快乐值的,如果我们不选 i i i,而是选未被选择的 i i i的子节点的话,那些经过点 i i i不经过该子节点的点的快乐值就会整体+1。
而那些即经过该子节点又经过点 i i i的点的快乐值是不变的,所以整体的快乐值就会增大。

因此,我们假设的情况并不是最优解。故我们的结论成立:如果一个点被选了,那么这个点的子节点一定被选。

对于一个被选的点而言,它对答案的贡献是什么呢?

首先,这个点会使得它的子节点的快乐值都-1,然后它到根节点的距离是他的贡献值。那么总的贡献就是 d e p [ i ] − s o n [ i ] dep[i]-son[i] dep[i]son[i]

我们只需要所有点的总贡献,然后取前 k k k个累加输出即可。

三、代码

#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 2e5 + 10;
int n, k;
vector<int>g[N];
int cnt[N], dep[N], son[N];
ll ans;

int dfs(int u, int deep, int father)
{	
	int sum = 0;
	for(int i = 0; i < g[u].size() ; i++ )
	{
		int j = g[u][i];
		if(j == father)continue;
		sum += dfs(j, deep + 1, u);
	}	
	dep[u] = deep;
	son[u] = sum;
	return sum + 1;
}
void solve()
{
	cin >> n >> k;
	for(int i = 0; i < n - 1; i ++ )
	{
		int a, b;
		cin >> a >> b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	dfs(1, 0, -1);
	for(int i = 1; i <= n; i ++ )
		cnt[i] = dep[i] - son[i];
	sort(cnt + 1, cnt + 1 + n);
	reverse(cnt + 1, cnt + 1 + n);
	
	for(int i = 1; i <= k; i ++ )
		ans += cnt[i];
	cout << ans << endl;

}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	solve();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/388673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Verdaccio 搭建私有 npm 仓库

背景 公司内部封装业务相关的组件库&#xff0c;工具库&#xff0c;希望统一管理和维护&#xff0c;在多个项目中都能使用&#xff0c;同时希望不公开&#xff0c;只在局域网中使用。所以&#xff0c;需要搭建私有 npm 仓库 Verdaccio verdaccio 是一个能够创建私有 registr…

vue:vue2与vue3的区别

一、背景 vue2是指的2.X vue3是指的3.0以及更新的版本&#xff08;3.2版本在script标签里可以写setup&#xff0c;极大的简化了开发&#xff09; 本文对比两者区别。 二、官网 生命周期选项 | Vue.js API 参考 | Vue.js Vue.js - 渐进式 JavaScript 框架 | Vue.js Vue.…

Redis学习【11】之分布式系统

文章目录一 数据分区算法1.1 顺序分区1.1.1 轮询分区算法1.1.2 时间片轮转分区算法1.1.3 数据块分区算法1.1.4 业务主题分区算法1.2 哈希分区1.2.1 节点取模分区算法1.2.2 一致性哈希分区算法1.2.3 虚拟槽分区算法二 分布式系统环境搭建与运行2.1 系统搭建2.1.1 系统架构2.1.2 …

物理层的概述(可以说是对王道计算机网络的笔记)

目录前言物理层概述基本概念数据通信基础知识数据通信相关术语三种通信方式两种传输方式码元&#xff0c;速率、波特、带宽**练习题**奈氏准则和香农定理奈氏准则&#xff08;奈奎斯特定理&#xff09;香浓定理结尾前言 本章内容讲述了物理层的概念,也是我上个星期上课的内容&…

现代检测技术-期末复习

文章目录差动结构的优点偏差/零位/微差法的应用偏差法测量零位法测量微差法测量格罗布斯准则&#xff08;作业题&#xff09;最小二乘法自相关/互相关算法的应用&#xff08;教材和课件案例&#xff09;自相关性分析互相关分析&#xff1a;电子计数器测频法&#xff08;作业题&…

第53章 短信验证服务和登录的前端定义实现

1 向src\router\index.js添加定义 { path: /LoginSms, name: 手机号登录, component: () > import(../views/LoginSmsView.vue) }, { path: /Users/Register, name: 用户注册, component: () > import(../views/Users/RegisterView.vue), }, 2 向src\common\http.api.js添…

Javascript借用原型对象继承父类型方法

借用原型对象继承父类型方法 目的: 儿子继承父类属性和方法&#xff0c;父类之后新增的方法不会被儿子继承。 前言&#xff1a; 先理解一个问题&#xff1a; Son.prototype Father.prototype; 这一操作相当于把Son的原型对象指向Father。 意味着Son的prototype的地址与Fa…

Vue基础学习 v-指令(2) 本地应用(记事本)

v-bind 设置元素的属性&#xff08;比如&#xff1a;src&#xff0c;title&#xff0c;class&#xff09; v-bind:属性名值 <div id"app"><img v-bind:src"imgSrc" alt"" v-bind:title"imgTitle"></div><scrip…

数学建模(一):LP 问题

文章目录数学建模&#xff08;一&#xff09;&#xff1a;LP 问题一、 MATLAB求解二、 Python 求解数学建模&#xff08;一&#xff09;&#xff1a;LP 问题 在人们的生产实践中&#xff0c;经常会遇到如何利用现有资源来安排生产&#xff0c;以取得最大经济效益的问题。此类问…

关于分布式事务的理解

关于分布式事务的理解 分布式事务之前先简单介绍下介于本地事务和分布式事务之间的两个事务&#xff1a;全局事务&#xff08;Global Transactions&#xff09;和共享事务&#xff08;Share Transactions&#xff09;的原理与实现。 先给全局事务做个限定&#xff1a;一种适用…

JVM运行时数据区划分

Java内存空间 内存是非常重要的系统资源&#xff0c;是硬盘和cpu的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略&#xff0c;保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机…

使用secure crt连接ensp中虚拟设备

0 前言 ensp中虚拟设备如路由器、防火墙等本质上是 virtualbox中运行的虚机&#xff0c;因此可通过 telnet 连接 127.0.0.1 及对应端口方式连接到ensp中设备&#xff1b; 1 连接方法 1.1 查看设备所监听端口 设备图标上&#xff0c;右键 设置 点击 配置&#xff0c;可查看到…

UGUI 上使用 Particle System 支持 Sorting Layer 排序渲染

UGUI 上使用 Particle System 支持 Sorting Layer 排序渲染 Unity 中 Particle System 在 UGUI 上是可以根据 Sorting Layer 以及 Order in Layer 和 UI 组件(Image、Text等) 排序渲染的 Layer 值高的能够遮挡 Layer 值低的 组件 开发中会有这样的需求&#xff1a;要求 Part…

CAD异形图形的绘制

这个CAD图形的难点在于如何画角度98长165的斜线&#xff0c;剩下的图形就很好画了&#xff0c;那么用到的命令有圆、直线、导圆角、偏移等多个CAD命令的结合 目标对象 操作步骤 1.先使用直线命令画相交于A点的两条辅助线段&#xff0c;然后以A点为圆心画半径47.5和直径65的圆…

Java -数据结构,【优先级队列 / 堆】

一、二叉树的顺序存储 在前面我们已经讲了二叉树的链式存储&#xff0c;就是一棵树的左孩子和右孩子 而现在讲的是&#xff1a;顺序存储一棵二叉树。 1.1、存储方式 使用数组保存二叉树结构&#xff0c;方式即将二叉树用层序遍历方式放入数组中。 一般只适合表示完全二叉树&a…

真实需求和梦想实现满足

多少的时光和岁月中都不曾认真系统的深度思考自己的真实需求和欲望之间是否一致&#xff0c;随着时间的流逝才发现自己追求的是一场空&#xff0c;自己的真实需求并不是苦苦追求的东西&#xff0c;这也是当梦想照进现实&#xff01;欲望是无善无恶的&#xff0c;不必为了满足自…

性能测试——LoadRunner: virtual user generator的使用

LoadRunner 在安装时取消勾选指定LoadRunner代理将要使用的证书&#xff0c;安装完成后会显示下面三个软件 Vitual User Generator&#xff1a;生成性能测试脚本Controller&#xff1a;创建测试场景&#xff0c;运行测试脚本&#xff0c;监控运行&#xff0c;收集到运行的数…

Spring——AOP是什么?如何使用?

一、什么是AOP&#xff1f;在不修改源代码的情况下 增加功能二、底层是什么&#xff1f;动态代理aop是IOC的一个扩展功能&#xff0c;现有IOC&#xff0c;再有AOP&#xff0c;只是在IOC的整个流程中新增的一个扩展点而已&#xff1a;BeanPostProcessorbean的创建过程中有一个步…

【JAVA】List接口

&#x1f3c6;今日学习目标&#xff1a;List接口 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰本期期数&#xff1a;第四期 &#x1f389;专栏系列&#xff1a;JAVA List接口一、ArrayList二、LinkedList总结一、ArrayList ArrayLis…

python完美实现一个自己的音乐服务器

最近发现&#xff0c;经常用的网易云音乐&#xff0c;有很多歌曲下架了&#xff0c;能听的越来越少了&#xff1b;歌单里的一些歌曲&#xff0c;现在要开通 VIP 才能听了。其实自己常听的歌曲不是很多&#xff0c;现在却有很多听不了了。怎么办呢&#xff0c;付费吗&#xff1f…