2023-09-21力扣每日一题

2023-09-22 09:35:42

链接:

2603. 收集树中金币

题意

一个无向无根树,每个点上有Coins[T]个金币,每次你可以选择吸收离自己距离小于等于2的节点的所有金币,也可以移动到相邻格子上,求全部吸完最小的移动次数(任选起点,但吸完要返回起点)

由于计算的是移动次数,所以你可以认为一直在吸,走到哪儿吸到哪儿

计算最后移动次数很简单,由于要回到起点,所以移动次数一定是(n-1)*2-当n>0时,因为两个点之间要经过两次(来回且无环)

根据度,我们可以移除两次,度为0和1的节点,这些节点的特点是可以看做叶子节点,由于我们可以直接吸距离2的所有金币,所以我们在父节点不需要向下移动,就可以处理掉这些叶子结点。要注意的是,做这一步时,要等所有叶子结点都挑出来以后再更新度,以免提前计算将要成为叶子节点的节点

同时要记得先把所有没金币的叶子节点去掉,这边要注意和上面不同的是,即时更新度,要把新的叶子结点中没金币的也去掉(我偷懒了,大循环了)

实际代码:

#include<bits/stdc++.h>
using namespace std;
int collectTheCoins(vector<int>& coins, vector<vector<int>>& edges)
{
    int lg=coins.size();
	if(lg<=5) return 0;
		
    vector<vector<int>>Map(lg);
    vector<bool>book(lg);
    
    //边结构 
    for(auto edge:edges)
    {
    	//if(coins[edge[0]]==0 || coins[edge[1]]==0) continue;
    	Map[edge[0]].push_back(edge[1]);
    	Map[edge[1]].push_back(edge[0]);
	}
	

	while(true)
	{
		bool kill=0;
		for(int j=0;j<lg;j++)
		{
			if(book[j]) continue;
			int du=0;
			for(auto edge:Map[j])
			{
				if(!book[edge]) du++;
			}
			//及时更新 
			if(du<=1 && coins[j]==0)
			{
				book[j]=1;
				kill=1;
			}
		}
		//全部空金币叶子结点移除 
		if(!kill) break;
	}
	
	//两层移除 
	for(int i=0;i<2;i++)
	{
		vector<int>True;
		for(int j=0;j<lg;j++)
		{
			if(book[j]) continue;
			int du=0;
			for(auto edge:Map[j])
			{
				if(!book[edge]) du++;
			}
			if(du<=1)
			{
				True.push_back(j);
			}
		}
		//延后更新
		for(auto T:True) book[T]=1;
	}
	//计算最后移动次数 
	int last=0;
	for(auto bk:book) 
	{
		if(!bk) last++;
	}

	return last?(last-1)*2:0;
}

限制:

  • n == coins.length
  • 1 <= n <= 3 * 104
  • 0 <= coins[i] <= 1
  • edges.length == n - 1
  • edges[i].length == 2
  • 0 <= ai, bi < n
  • ai != bi
  • edges 表示一棵合法的树。
更多推荐

【Unity3D】资源管理

1前言Unity中资源管理方案主要有Resources、TextAsset、ScriptableObject、AssetDatabase、PlayerPrefs、Addressables、AssetBundle、SQLite,本文将介绍其中大部分方案。2ResourcesResources主要用于加载资源,被加载的资源

涂刷三防漆的规范

刷涂法是最简单的涂覆方法。通常用于局部的修补和维修,也可用于实验室环境或小批量试制/生产,一般是涂覆质量要求不是很高的场合。刷涂法的优点:是几乎不需设备夹具投资;节省涂覆材料;一般不需要遮盖工序。缺点:是适用范围窄;效率最低;整板刷涂时有遮蔽效应,涂覆一致性差,因人工操作,易出现气泡、有波纹、厚度不均匀等缺陷;需要大量

网络安全--防火墙

一、防火墙二、防火墙实验拓扑图第一步、准备条件1、云的设置单击云设备,先选择UDP,再增加,增加之后就会记录在下面。再增加一个虚拟的网卡,选择一个电脑中的虚拟网卡,然后增加。先选择对应端口,勾选上双向通道,点击添加,右边会自动生成端口映射表。2、防火墙设置导入防火墙的配置即可。需要包的点击连接下载:https://pa

大厂面试-16道面试题

1java集合类有哪些?List是有序的Collection,使用此接口能够精确的控制每个元素的插入位置,用户能根据索引访问List中元素。常用的实现List的类有LinkedList,ArrayList,Vector,Stack。ArrayList是容量可变的非线程安全列表,其底层使用数组实现。当几何扩容时,会创建更

爱看小说手机网源码全站带数据带自动采集程序/ThinkPHP内核小说网站源码+书库数据库带自动采集

爱看小说手机网源码全站带数据带自动采集程序,爱看小说程序源码+2W条数据全站打包,自动采集程序网站源码,后台已经更新5个采集规则可以采集小说30万本大概约10G。分享的这一款自带2w数据爱看小说网源码全站带数据打包,ThinkPHP内核小说网站源码带听书等全部插件,而且还带了采集规则,可以拿去测试!做好数据多更新数据,

使用Python 3脚本自动化Harbor镜像复制

介绍:在容器化应用程序的世界中,Docker镜像是构建和部署的核心。许多组织使用Harbor作为他们的镜像仓库管理解决方案。但有时候,需要将镜像从一个Harbor仓库复制到另一个,这可能会是一个繁琐的任务。为了简化这个过程,我们将介绍如何使用Python脚本来自动化这个任务。这个脚本将从源Harbor仓库中复制镜像,并

Linus Torvalds接受来自微软的Linux Hyper-V升级

导读微软最近推送了一些变更,旨在改进即将发布的Linux内核6.6版本对Hyper-V的支持。这些改进包括在Hyper-V上支持AMDSEV-SNPguest和IntelTDXguest。除了这两项,还有其他一些升级,如改进了VMBus驱动程序中的ACPI(高级配置和电源接口)根对象处理等。Linux领头人LinusT

LeetCode刷题---Add Two Numbers(一)

文章目录🍒题目🍒解法一迭代🍒解法二递归🍒递归小案例🍒迭代VS递归🍒题目给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。本道题,我们采用两个主流的思

MySQL-Linux安装、卸载:

MySQL8.0.26-Linux版安装1.准备一台Linux服务器云服务器或者虚拟机都可以;Linux的版本为CentOS7;2.下载Linux版MySQL安装包https://downloads.mysql.com/archives/community/3.创建目录,上传MySQL安装包/usr/local/src

能ping通但无法上网的问题

大家好,今天我要和大家分享一下当你的IP地址能够成功ping通,却无法上网时该如何解决这个问题。这是一个相当常见的情况,在网络故障排查中经常遇到。别担心,我将为你揭开这个谜题,提供一些解决方案和技巧。首先,我们需要了解一下可能导致这种问题的原因。通常情况下,当你的IP地址能够成功ping通,这意味着你的计算机能够与目标

阿里云服务器经济型e实例租用价格和CPU性能测评

阿里云服务器ECS推出经济型e系列,经济型e实例是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器,CPU采用IntelXeonPlatinum架构处理器,支持1:1、1:2、1:4多种处理器内存配比,e系列性价比优选,新品e实例价格低至15元/月,折合0.5元

热文推荐