Codeforces1336A Linova and Kingdom (思维)
题目链接: Linova and Kingdom
大致题意
有n座城市, n-1条连通城市间的双向道路. 城市1是首都, 所有的城市可以看做是以1号点为根的树形结构.
我们需要从中选择m座城市, 让其发展工业, 其余的城市则发展旅游业.
从工业城市i前往城市1的最短路径所经过的旅游业城市数目, 定义为i城市的贡献度.
你可以自定义m座发展工业的城市, 问: m座城市的最大贡献度之和是多少.
解题思路
首先不难贪心联想到: 我们选择叶子结点成为工业城市好像要更优一些.
假设1~n所有城市形成一条链, 此时如果m=1必然我们选择叶子结点最优. 那如果m=2呢? 我们应选择最靠下的两个节点.
考虑回正常的树. 我们之所以认为选择叶子节点会更优, 是因为对于树中任意一条链而言, 这条链上距离根节点最远的点为叶子节点. 如果m=2, 此时树有两条链构成, 一条链上只有一个点(距离根节点的距离是1), 另外一条链很长. 我们不难发现, 我们应该在长链上选择链尾的两个节点.
因此我们得出结论: 我们并不是选择叶子节点更优, 而是选择深度更大的节点更优.
接下来我们再思考, 假设有两个相同深度节点a, b. 节点a有2个为叶子节点的子节点, 节点b有1个为叶子节点的子节点, 此时如果我在a, b中做选择, 我应该选择节点a.
当选择了某个叶子节点, 也选择了该叶节点的父亲节点时, 此时叶子节点对答案的贡献减少1.
若选择了num个叶子节点, 它们有同一个父亲节点p, 此时我选择p节点后, 相当于对答案的贡献减少了num.
再推广, 如果对于一个节点q, 其子树内选择了num个节点, 我选择节点q后, 对答案贡献减少了num.
由此我们得出结论: 当选择非叶节点时, 我们要考虑其深度和其子树内选择的点的数目两个因素.
其实我们也不难想到, 当我们考虑是否选择某个节点时, 该节点子树内所有的节点应都已经被选择. 否则我选择任一子树内部节点, 都比当前节点更优.
由此我们可以得出每个节点对答案贡献公式: 该节点贡献 = 该节点深度 - 其子树节点个数
我们贪心选择前m个贡献最大的节点即可.
AC代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
const int N = 2E5 + 10;
vector<int> edge[N];
int qaq[N], sz[N];
void dfs(int x = 1, int fa = 0, int depth = 0) {qaq[x] = depth; sz[x] = 1;for (auto& to : edge[x]) {if (to == fa) continue;dfs(to, x, depth + 1);sz[x] += sz[to];}qaq[x] -= sz[x] - 1;
}
int main()
{int n, m; cin >> n >> m;rep(i, n - 1) {int a, b; scanf("%d %d", &a, &b);edge[a].push_back(b);edge[b].push_back(a);}dfs();sort(qaq + 1, qaq + 1 + n, greater<>());ll res = 0;rep(i, m) res += qaq[i];cout << res << endl;return 0;
}
END
Codeforces1336A Linova and Kingdom (思维)相关推荐
- Linova and Kingdom
Linova and Kingdom 题目来源:Codeforces Round #635 (Div. 2) C题 Writing light novels is the most important ...
- CF1336 A. Linova and Kingdom
A. Linova and Kingdom 题意 给你一颗 n n n个节点根为1号节点的树,选 k k k个城市作为工业城市,其余为旅游城市,工业城市的使节每经过旅游城市开心值+1,求所有工业城市的 ...
- C. Linova and Kingdom
链接:https://codeforces.ml/contest/1337/problem/C Writing light novels is the most important thing in ...
- 1336A - Linova and Kingdom
链接: https://codeforces.com/problemset/problem/1336/A 题意: 有一个n节点树,根为1,现在要设置k个工业城市,剩下n-k个旅游城市,让每个工业城市前 ...
- CodeForces - 1337C Linova and Kingdom(贪心)
题目链接:点击查看 题目大意:给出一棵树表示一个国家,点1表示首都,现在需要分配 k 个城市为工业城市,其余 n - k 个城市为旅游城市,这个国家会定时在首都召开会议,换句话说,所有工业城市都必须派 ...
- CF1336A Linova and Kingdom
看这里 大意: 有一个有 n 个点的树,以 1 为根,你可以选择 k 个节点,使得这 k 个节点到 1 节点的最短路径中经过的非选择的点最多. 思路: 简单树形dp 我们肯定会优先最好的叶子结点,这个 ...
- bottom sheets_Excel 2013中的SHEET和SHEETS函数
bottom sheets I've been experimenting with the new SHEET and SHEETS functions in Excel 2013, to see ...
- bottom sheets_使用Sheetson建立由Google Sheets支持的免费电子邮件列表
bottom sheets When building an initial MVP for your product, it's wise to avoid unnecessary expenses ...
- Codeforces补题记录(1)
文章目录 Codeforces补题记录(1) 1.Codeforces Round #632 (Div. 2)(2020.4.11) A.Little Artem B.Kind Anton *C.Eu ...
- Codeforces Round #635 (Div. 2)(A~D)题解
Codeforces #635 A~D A.Ichihime and Triangle B.Kana and Dragon Quest game C.Linova and Kingdom D.Xeni ...
最新文章
- IP子网划分和vlsm(变长子网掩码)和路由汇总
- 马斯克放话:6个月内公测卫星互联网!颠覆5G的将不是6G
- 使用VScode开发ESP32,PlatformIO开发ESP32
- python爬虫正则表达式实例-Python 正则表达式爬虫使用案例解析
- 在Linux上安装其他版本的cmake 或 升级cmake
- 【错误记录】Android 编译时技术版本警告 ( 注解处理器与主应用支持的 Java 版本不匹配 )
- 以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末
- chrome自动调节窗口大小插件_高效使用Chrome浏览器的10个技巧
- 卷积神经网络精确率不增反降_深度学习 第四门课:卷积神经网络(Convolutional Neural Networks)...
- 12月29日课程笔记 磁盘格式化与挂载与手动增加swap空间
- 新版本IntelliJ IDEA 构建maven,并用Maven创建一个web项目
- Conda activate报错 CommandNotFoundError: Your shell has not been properly configured to use ‘conda
- DIV+CSS的命名规则有利于SEO
- Java学习手册:Java网络编程面试问题
- 微信公众号开发文档参考
- 经纬财富:亳州炒白银操作方法,谨防亏损
- JTree创建、获取和删除节点的方法
- vue项目没有router文件夹_router文件夹
- warning: setUpNet DNN module was not built with CUDA backend; switching to CPU错误解决
- mysql查询学生表年龄语句_mysql中一张(居民)表按年龄段查询数据
热门文章
- if - else 案例.py
- python类似图片查找_python检测相似图片
- 阿里云平台购买域名 免费申请SSL证书
- win10 摄像头启动不了
- hdmi接口线_HDMI高清线注意事项
- 离散数学学习心得(一)逻辑和证明
- erp计算机英语词汇,ERP词汇 - 外贸英语 - 福步外贸论坛(FOB Business Forum) |中国第一外贸论坛...
- c语言开发 kdj,KDJ——随机指标之王
- 101名女职工血清总胆固醇测量结果spss描述统计分析
- Android键盘删除键问题