当前位置:网站首页>codeforces Linova and Kingdom
codeforces Linova and Kingdom
2022-08-02 14:22:00 【先求一个导】
题目
题意: 给定以1为根的树,选择恰好k个点染黑色,其余点为白色。这k个点的幸福值为其到树根的最短路上白色点的个数,问和最大为多少。
思路: 贪心。首先深度深的叶子最优,其次就不好说了,选了父节点子节点贡献就会减少。不妨把子节点贡献减少的值交给父节点,这样总和不变,可以据此直接排序选出贡献最大的k个点。
时间复杂度: O(nlogn)
代码:
// Problem: A. Linova and Kingdom
// Contest: Codeforces - Codeforces Round #635 (Div. 1)
// URL: https://codeforces.com/problemset/problem/1336/A
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int n,m,k,T;
vector<int> va[N];
int sz[N];
int ans[N];
void dfs(int cur,int fa,int d)
{
sz[cur] = 1;
for(auto j:va[cur])
{
if(j==fa) continue;
dfs(j,cur,d+1);
sz[cur] += sz[j];
}
// if(cur==4) cout<<d<<" "<<sz[cur]<<"\n";
ans[cur] = d - sz[cur] + 1;
}
void solve()
{
cin>>n>>k;
for(int i=0;i<n-1;++i)
{
int x,y; cin>>x>>y;
va[x].push_back(y),va[y].push_back(x);
}
dfs(1,0,0);
// for(int i=1;i<=n;++i) cout<<i<<":"<<ans[i]<<"\n";
sort(ans+1,ans+n+1);
int now = n;
long long res = 0;
while(k--)
{
res += ans[now--];
}
cout<<res;
}
signed main(void)
{
solve();
return 0;
}
边栏推荐
- 【网络参考模型】
- nodemon : 无法加载文件 D:\Program Files\nodejs\node_global\nodemon.ps1
- 第六章-6.1-堆-6.2-维护堆的性质-6.3-建堆
- 2022-07-16 第五小组 瞒春 学习笔记
- static关键字的三种重要作用详解
- 2022-07-27 第六小组 瞒春 学习笔记
- XML和注解(Annotation)
- 解决(An error happened during template parsing (template: “class path resource [templates/...]
- 【Hiflow】 开辟新道路的自动化助手!
- DOM —— 元素盒子模型
猜你喜欢
随机推荐
EL 表达式 & JSTL 标签库
【JS执行机制】
Explain in detail how the bit manipulation operators in C language can be used?
炎炎夏日打造一个属于自己的“便携小空调”吧
Scala的模式匹配与样例类
XML技术
2022-07-25 第六小组 瞒春 学习笔记
nodejs 的下载安装与环境配置
第六章-6.1-堆-6.2-维护堆的性质-6.3-建堆
DOM - Event Object
如何正确且快速的清楚C盘!!释放C盘空间内存保姆级教程
2022-07-09 第五小组 瞒春 学习笔记
【SVM回归预测】基于LibSVM实现多特征数据的预测
如何使用Swiper外部插件写一个轮播图
Servlet 技术2
FIR滤波器设计之窗函数法
第五章-5.2-指示器随机变量
Golang基础教程
双亲委派机制
为什么四个字节的float表示的范围比八个字节的long要广?