NOIP2018-S-DAY1-3-赛道修建(洛谷P5021)的题解

目录

题目

原题描述:

题目描述

输入格式

输出格式

输入输出样例

主要思路:

check:

真正的code:


原题描述:
 

题目描述

C 城将要举办一系列的赛车比赛。在比赛前,需要在城内修建 m 条赛道。

C 城一共有 n 个路口,这些路口编号为1,2,...,n,有 n-1条适合于修建赛道的双向通行的道路,每条道路连接着两个路口。其中,第i条道路连接的两个路口编号为a_i和 b_i,该道路的长度为 l_i。借助这 n-1 条道路,从任何一个路口出发都能到达其他所有的路口。

一条赛道是一组互不相同的道路 e_1,e_2,..,e_k,满足可以从某个路口出发,依次经过 道路 e_1,e_2,..,e_k(每条道路经过一次,不允许调头)到达另一个路口。一条赛道的长度等于经过的各道路的长度之和。为保证安全,要求每条道路至多被一条赛道经过。

目前赛道修建的方案尚未确定。你的任务是设计一种赛道修建的方案,使得修建的 m 条赛道中长度最小的赛道长度最大(即m 条赛道中最短赛道的长度尽可能大)

输入格式

输入文件第一行包含两个由空格分隔的正整数 n,m,分别表示路口数及需要修建的 赛道数。

接下来 n-1 行,第i行包含三个正整数 a_ib_i,l_i,表示第i条适合于修建赛道的道 路连接的两个路口编号及道路长度。保证任意两个路口均可通过这 n-1 条道路相互到达。每行中相邻两数之间均由一个空格分隔。

输出格式

输出共一行,包含一个整数,表示长度最小的赛道长度的最大值。

输入输出样例

输入 #1

7 1 
1 2 10 
1 3 5 
2 4 9 
2 5 8 
3 6 6 
3 7 7

输出 #1

31

输入 #2

9 3 
1 2 6 
2 3 3 
3 4 5 
4 5 10 
6 2 4 
7 2 9 
8 4 7 
9 4 4

输出 #2

15

 

主要思路:

题目说的很复杂,实际上很简单,就是给你一棵树,然后让你找到m条链,每条链没有公共边,然后问长度最小的链长度最大是多少。

首先,看道这题,先想到二分。

我们可以二分答案,就是最小的链的长度。

接着就是check:

check:

我们可以用个dfs,tmp[x] 就是到x的最大边,则枚举所有到x的边,然后dfs()一下,接着tmp[x] = tmp[it]+边权。

dfs部分代码:

void dfs(int x,int fa,int k)//x是当前节点,k是要达成的长度
{
//	cout<<x<<' '<<fa<<' '<<k<<'\n';tmp[x] = 0;multiset<int> s;for(auto it:v[x]){if(it.first!=fa){dfs(it.first,x,k);tmp[x] = tmp[it.first]+it.second;//tmp加上if(tmp[x]>=k){ans++;//ans是可成立的边数}else//否则,就要放进multiset{s.insert(tmp[x]);}}}
}

这里的multiset就是存储子树内还不够的长度。

接着,我们看一下s里的元素,s非空时,而且s只有一个元素,就说明这个数和谁都不能匹配,那么就要和他的爷爷们连边了(只有一个点可以和爷爷连边)

为了给爷爷们减轻负担,所以我们希望让那个点的tmp尽量大(这就是一种贪心)。

否则,就lower_bound(k-s.begin());

我们从小的选大的,为啥呢?

从之前的结论得到,我们要尽量给爷爷们减少麻烦,所以要选大的,所以是小选大

所以最后dfs和check代码长这样

vector<vector<pair<int,int>>>v(500010);
int ans=0;
int tmp[500010];
void dfs(int x,int fa,int k)
{
//	cout<<x<<' '<<fa<<' '<<k<<'\n';tmp[x] = 0;multiset<int> s;for(auto it:v[x]){if(it.first!=fa){dfs(it.first,x,k);tmp[x] = tmp[it.first]+it.second;if(tmp[x]>=k){ans++;}else{s.insert(tmp[x]);}}}int mx=0;while(!s.empty())//贪心思想{if(s.size() == 1){tmp[x] = max(mx,*s.begin());return ;}auto it=s.lower_bound(k-*s.begin());if(it == s.begin()&&s.count(*it) == 1){it++;}if(it == s.end()){mx = max(mx,*s.begin());s.erase(s.find(*s.begin()));}else{ans++;s.erase(s.find(*s.begin()));s.erase(s.find(*it));}}tmp[x] = mx;
}
bool check(int mid)
{ans = 0;dfs(1,-1,mid);return ans>=m;
}

接着就差不多搞定了。

但还有一个小细节。

就是二分的r他的上限不是自己定义的,而是树的直径。

否则会被这个hack:

2 0
1 2 1000

输出:

1000

真正的code:
 

#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<vector<pair<int,int>>>v(500010);
int ans=0;
int tmp[500010];
void dfs(int x,int fa,int k)
{
//	cout<<x<<' '<<fa<<' '<<k<<'\n';tmp[x] = 0;multiset<int> s;for(auto it:v[x]){if(it.first!=fa){dfs(it.first,x,k);tmp[x] = tmp[it.first]+it.second;if(tmp[x]>=k){ans++;}else{s.insert(tmp[x]);}}}int mx=0;while(!s.empty()){if(s.size() == 1){tmp[x] = max(mx,*s.begin());return ;}auto it=s.lower_bound(k-*s.begin());if(it == s.begin()&&s.count(*it) == 1){it++;}if(it == s.end()){mx = max(mx,*s.begin());s.erase(s.find(*s.begin()));}else{ans++;s.erase(s.find(*s.begin()));s.erase(s.find(*it));}}tmp[x] = mx;
}
bool check(int mid)
{ans = 0;dfs(1,-1,mid);return ans>=m;
}
int up;
int dfs1(int x,int fa)//数的直径
{int sum1=0,sum2=0;for(auto it:v[x]){if(it.first == fa){continue;}sum2=max(sum2,dfs1(it.first,x)+it.second);if(sum1<sum2){swap(sum1,sum2);}}up=max(up,sum1+sum2);return sum1;
}
int main()
{
//	freopen("sample (13).in","r",stdin);ios::sync_with_stdio(0);cin.tie(0);cin>>n>>m;for(int i=1;i<n;i++){int x,y,z;cin>>x>>y>>z;v[x].push_back({y,z});v[y].push_back({x,z});}dfs1(1,0);int l=0,r=up;int ans=0;while(l<=r){int mid=(l+r)/2;if(check(mid)){ans = mid;l = mid+1;}else{r = mid-1;}}cout<<ans;return 0;
}

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

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

相关文章

rancher里的ingress如何配置gzip压缩

方案一&#xff0c;未试验成功&#xff0c;但配置过程值得记录一下 通过配置configmap&#xff0c;然后在ingress的deployment里引用configmap实现。 参考文章 创建configmap apiVersion: v1 kind: ConfigMap metadata:name: nginx-ingress-controllerannotations:{} # k…

WPF Button去除按钮边框,添加下划线

<Button Width"45" Height"25" FontSize"20" Background"Transparent" BorderBrush"Transparent" Foreground"#FFC9A322" Click"Btn_Retry_Click" ><TextBlock><Underline>重试</…

01_lombok review

文章目录 Lombok父子工程ide中的Maven基础配置前置知识储备 Lombok 怎么引入Lombok依赖&#xff1a; step1&#xff1a;引入Lombok依赖 eg&#xff1a; <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok<…

数据库管理-第159期 Oracle Vector DB AI-10(20240311)

数据库管理159期 2024-03-11 数据库管理-第159期 Oracle Vector DB & AI-10&#xff08;20240311&#xff09;1 其他distance函数2 实例演示使用其他函数寻找最近向量点函数变体简写语法 总结 数据库管理-第159期 Oracle Vector DB & AI-10&#xff08;20240311&#x…

网络安全AI智能体公司「云起无垠」获数千万元天使+轮融资,致力于大模型与网络安全深度融合的技术研究

「云起无垠」致力于打造最懂安全的AI智能体&#xff0c;通过持续运营的工具、知识以及记忆引擎&#xff0c;不断提升智能体对用户安全场景的理解&#xff0c;以达到易于使用、自我学习、自主行动的特性&#xff0c;助力企业自动化执行各类安全任务&#xff0c;让软件更安全&…

解决:黑马webpack视频中出现的问题总结

问题 1 ERROR in main Module not found: Error: Can‘t resolve ‘./src‘ 解决 Webpack 中 ERROR in main Module not found: Error: Can‘t resolve ‘./src‘ 问题 黑马AJAX-Node.js-Webpack教学视频&#xff08;BV1MN411y7pw 其中P98&#xff09;中webpack部分&#xff0c…

代理IP如何应对自动化测试和爬虫检测

目录 一、代理IP在自动化测试和爬虫中的作用 二、代理IP的优缺点分析 1.优点 2.缺点 三、应对自动化测试和爬虫检测的策略 1.选择合适的代理IP 2.设置合理的请求频率和间隔 3.模拟人类行为模式 4.结合其他技术手段 四、案例与代码示例 五、总结 在自动化测试和爬虫开…

传递函数硬件化

已知一个系统的传递函数&#xff0c;如何进行硬件化呢&#xff1f; 只需要将传递函数离散化&#xff0c;得到差分方程&#xff0c;就可以根据差分方程进行硬件设计。 通过例子说明&#xff1a; 得到差分方程后&#xff0c;其中y(k)/y(k-1)/y(k-2)/u(k-1)/u(k-2)等代表不同周期…

软考如何选择?信息系统项目管理师值得选吗?

软考有五大专业方向和三个等级&#xff0c;一共有27个资格认证&#xff0c;如果没有进行深入了解的情况下从这27个中选择一个可能会为难。一般情况下&#xff0c;我们进行选择的时候都会结合自己所学的专业方向、所在的工作岗位发展方向去选择&#xff0c;但是我给大家的建议是…

华为OD机试 - 垃圾信息拦截(Java 2024 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

Node.js 安装和配置

一、Node.js 下载和安装 1.1 下载 Node.js 打开 Node.js — Download (nodejs.org)&#xff0c; 选择合适的版本。 1.2 安装 Node.js 双击 node-v20.11.1-x64.msi&#xff0c;安装 Node.js &#xff08;自定义安装目录&#xff0c;我的修改为 D:\Program Files\nodejs\&…

Google发布创新AI工具Path Foundation和Derm Foundation,突破医学影像解读瓶颈,开启病理学与皮肤科研究新纪元

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

解压常见_gzip:stdin:not in gzio format:怀疑下文件是否损坏

此次的主角文件是&#xff1a;pin-2.14-71313-gcc.4.4.7-linux.tar.gz 结论&#xff1a;文件后缀没问题&#xff0c;就先怀疑下是不是文件损坏了 ls指令看不出任何端倪 文件名、后缀都正常 解压出现报错 瞅瞅文件大小 du -h <文件名> 呦呵 4kb&#xff0c;和应该的大…

基于SpringBoot的信息技术知识赛系统设计与实现

该系统使用的到的开发工具为Eclipse&#xff0c;使用的数据库为Mysql&#xff0c;使用的框架为SpringBoot框架。 系统主要实现了如下功能&#xff1a; 用户信息管理 如图5.1显示的就是用户信息管理页面&#xff0c;此页面提供给管理员的功能有&#xff1a;用户信息的查询管理…

波司登高德康:以有“韧性”的创新应变市场新浪潮

伴随着消费升级&#xff0c;羽绒服市场需求日益旺盛。愈发多元化的需求对于企业发展也有着更高的要求。如何更好推动行业多元化发展&#xff0c;可以从波司登的品牌升级、产品创新、模式创新、数字技术创新、绿色发展创新等方面窥得一二。 高德康总裁接受新华网主持人采访 对此…

Codeforces Round 933 (Div. 3)C:Rudolf and the Ugly String

题目链接&#xff1a;Dashboard - Codeforces Round 933 (Div. 3) - Codeforces 解题思路&#xff1a; 解题思路&#xff1a; 题目大概意思是字符串中最少去掉几个单词可以使字符串变漂亮&#xff0c;其实只要找“map"和”pie“这两个单词数量&#xff0c;注意判断&quo…

【PyTorch][chapter 22][李宏毅深度学习]【无监督学习][ WGAN]【理论一】

简介&#xff1a; 2014年Ian Goodfellow提出以来&#xff0c;GAN就存在着训练困难、生成器和判别器的loss无法指示训练进程、生成样本缺乏多样性等问题。从那时起&#xff0c;很多论文都在尝试解决&#xff0c;但是效果不尽人意&#xff0c;比如最有名的一个改进DCGAN依靠的是对…

Kafka的基本介绍以及扩展

文章目录 基本操作新增Topic查询Topic修改Topic删除Topic 生产者和消费者创建生产者创建消费者 Broker扩展Producer扩展Topic、Partition、Message扩展存储策略容错机制 基本操作 新增Topic 指定两个分区&#xff0c;两个副本&#xff0c;replication不能大于集群中的broker数…

【MAC】MacOS M2 芯片的Mysql 数据库安装与使用

1.下载 https://downloads.mysql.com/archives/community/ 选择ARM的 2.安装 在安装到最后一步&#xff1a;configuration 一定要选择Use Legacy Password Encryption。 一定要记得输入密码&#xff0c;这个密码也是登陆mysql的密码&#xff0c;非常重要。备注&#xff1a;…

Huggingface中Transformer模型使用

NLP自从Transformer模型出现后&#xff0c;处理方式有大统一的趋势&#xff0c;首先回答几个基础问题&#xff1a; 1、自然语言处理究竟要做一件什么事呢&#xff1f;自然语言处理最终解决的是分类问题&#xff0c;但是它不仅仅输出一个分类的预测结果&#xff0c;关键的在于构…