luogu3942 将军令 贪心
题目大意:给你一个地图(树),共有1~n个驿站(点),编号分别为1~n,告诉你第ui个驿站与第vi个驿站有一条长度为1的路(边),每个小队(可以放在任意驿站上)最多有k的覆盖长度,问最多要放置多少个小队才能把整张图全部覆盖?
把一个驿站当作市中心(树根),显然离市中心越偏远(深度越深)的驿站就越难被控制,所以我们优先考虑深度最深的节点。用来控制深度最深的节点v的小队应当布置在能控制到v且离v最远的节点u上,这样顺带着控制到的节点是最多的。所以具体操作为:将节点按照深度从大到小排序,判断是否覆盖过,如果没覆盖过,找其k级父亲并覆盖其周围距离不超过k的所有节点。这种方法没有后效性,因为选了一个节点不会导致其它节点不能选。
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cstdarg>
using namespace std; const int MAX_NODE = 100010;
int K; void _printf(const char *format, ...)
{
#ifdef _DEBUG
//va_list(args);
//va_start(args, format);
//vprintf(format, args);
//va_end(args);
#endif
} struct Node
{
int Id;
int Depth;
Node *Fa;
vector<Node*> Next;
bool Ctrled;
}_nodes[MAX_NODE], *Root, *Order[MAX_NODE];
int TotNode; void AddEdge(int uId, int vId)
{
Node *u = _nodes + uId, *v = _nodes + vId;
u->Id = uId, v->Id = vId;
u->Next.push_back(v);
v->Next.push_back(u);
} void Read()
{
int t, u, v;
scanf("%d%d%d", &TotNode, &K, &t);
for (int i = 1; i <= TotNode - 1; i++)
{
scanf("%d%d", &u, &v);
AddEdge(u, v);
}
} void Init_Dfs(Node *cur, Node *fa, int depth)
{
cur->Depth = depth;
cur->Fa = fa;
_printf("%d->%d depth %d\n", fa?fa->Id:0, cur->Id, cur->Depth);
int len = cur->Next.size();
for (int i = 0; i < len; i++)
if (cur->Next[i] != fa)
Init_Dfs(cur->Next[i], cur, depth + 1);
} void SetDepth()
{
Root = _nodes + 1;
Init_Dfs(Root, NULL, 1);
} bool Cmp_Depth(Node *a, Node *b)
{
return a->Depth > b->Depth;
} void SetOrder()
{
for (int i = 1; i <= TotNode; i++)
Order[i] = _nodes + i;
sort(Order + 1, Order + TotNode + 1, Cmp_Depth);
} void SetCtrl_Dfs(Node *fa, Node *cur, int k)
{
_printf("ctrled %d\n", cur->Id);
cur->Ctrled = true;
int len = cur->Next.size();
if (k < K)
for (int i = 0; i < len; i++)
if (cur->Next[i] != fa)
SetCtrl_Dfs(cur, cur->Next[i], k + 1);
} int SetCtrl()
{
int ans = 0;
for (int i = 1; i <= TotNode; i++)
{
Node *cur = Order[i];
if (!cur->Ctrled)
{
_printf("deepest %d ", cur->Id);
ans++;
for (int j = 1; j <= K && cur->Fa; j++)
cur = cur->Fa;
_printf("lighted %d\n", cur->Id);
SetCtrl_Dfs(NULL, cur, 0);
}
}
return ans;
} int main()
{
Read();
SetDepth();
SetOrder();
printf("%d\n", SetCtrl());
return 0;
}
luogu3942 将军令 贪心的更多相关文章
- [luogu3942] 将军令
题面 题目的意思大概是给你一棵n个点的树, 求最少需要多少个多少个点, 整棵树都被覆盖(覆盖的意思是所有离被选中的点距离不大于k的点都视作已覆盖). 考虑贪心(其实我考试的时候以为是道树形dp ...
- luogu3942将军令
https://www.zybuluo.com/ysner/note/1302132 题面 在大小为\(n\)的树上选择尽量少的点,使得所有未选择的点距离选择了的点小于等于\(k\). \(n\leq ...
- 8.11 NOIP模拟测试17 入阵曲+将军令+星空
T1 入阵曲 前缀和维护可以得60分 f[x1][y1][x2][y2]=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]; O(n4) ...
- [洛谷P3942]:将军令(贪心)
题目传送门 题目背景 历史/落在/赢家/之手至少/我们/拥有/传说谁说/败者/无法/不朽拳头/只能/让人/低头念头/却能/让人/抬头抬头/去看/去爱/去追你心中的梦 题目描述 又想起了四月.如果不是省 ...
- 【模拟8.11】将军令(贪心&&树形DP)
只看45分的话,是树形DP....(当然也有能拿到70分+的大佬) 40分: 只考虑k==1的情况,树形DP 所以每个节点可能被父亲,自己,儿子控制 设f[MAXN][3],0表示儿子,1表示自己,2 ...
- 洛谷P2279 消防局的设立 [HNOI2003] 贪心
正解:贪心 解题报告: 传送门! 这题贪心得挺显然的,,,?居然能有蓝,,,是蓝题太水了嘛,,,? 简单说下,这题一看到就能想到,对最低的没被覆盖到的点给它的祖父建一个消防局 没了? 哦这题实现还挺有 ...
- 洛谷 P3942 将军令 解题报告
P3942 将军令 题目描述 又想起了四月. 如果不是省选,大家大概不会这么轻易地分道扬镳吧? 只见一个又一个昔日的队友离开了机房. 凭君莫话封侯事,一将功成万骨枯. 梦里,小\(F\)成了一个给将军 ...
- P3942 将军令
P3942 将军令 梦里,小 F 成了一个给将军送密信的信使. 现在,有两封关乎国家生死的密信需要送到前线大将军帐下,路途凶险,时间紧迫.小 F 不因为自己的祸福而避趋之,勇敢地承担了这个任务. 不过 ...
- [洛谷P3942] 将军令
洛谷题目链接:将军令 题目背景 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人/低头 念头/却能/让人/抬头 抬头/去看/去爱/去追 你心中的梦 题目描述 又 ...
随机推荐
- [Luogu 2216] [HAOI2007]理想的正方形
[Luogu 2216] [HAOI2007]理想的正方形 题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输 ...
- Spring Boot (8) 全局异常处理
服务层和dao层的最终异常会交给controller处理,控制层的异常则会记录日志系统. 新建一个类用来处理异常,名字随便GlobalDefaultExceptionHandler.java,加上@C ...
- shiro英语
Security Manager安全管理人员 Tutorial 辅导的 transient 短暂的 Cipher 密码 Memory 记忆 Access 访问Handy Hint 方便提示separa ...
- 全局设置border-box
全局设置 border-box 很好,更符合我们通常对一个「盒子」尺寸的认知.,其次它可以省去一次又一次的加加减减,它还有一个关键作用——让有边框的盒子正常使用百分比宽度.但是使用了 border-b ...
- Spring JPA 简单配置使用
JPA 常用配置: # JPA (JpaBaseConfiguration, HibernateJpaAutoConfiguration) spring.data.jpa.repositories.b ...
- OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主
首先准备好所有要使用到的文件 下载链接:https://share.weiyun.com/5WgQHtx 步骤1. 首先安装驱动 解压后执行 Install.bat 部分电脑需要禁用驱动程序签名才可以 ...
- C#调用Java的WebService出现500 服务器错误
最近在用C#调用Java写的WebService时,发现老是返回500 服务器错误,到底什么原因一直找不出来, 后来google了以后,找到国外的http://stackoverflow.com站点已 ...
- 在jboss上部署web应用
1.JBoss介绍 JBoss完全实现了J2EE的服务栈: EJB (Enterprise JavaBeans) JMS (Java Message Service) JTS/JTA (Java Tr ...
- Vim入门基础知识集锦
1. 简介 Vim(Vi[Improved])编辑器是功能强大的跨平台文本文件编辑工具,继承自Unix系统的Vi编辑器,支持Linux/Mac OS X/Windows系统,利用它可以建立.修 ...
- eoLinker上线两周年+ AMS V4.0 发布:全新UI界面,带来领先的API开发管理解决方案!
2018年7月,eoLinker 发布了<eoLinker AMS 2018年年中用户调研问卷>,前后经历一周的时间,共收集到超过1000份有效调查问卷.超过300个有效改进意见. eoL ...