[洛谷P3942]:将军令(贪心)
题目传送门
题目背景
历史/落在/赢家/之手
至少/我们/拥有/传说
谁说/败者/无法/不朽
拳头/只能/让人/低头
念头/却能/让人/抬头
抬头/去看/去爱/去追
你心中的梦
题目描述
又想起了四月。
如果不是省选,大家大概不会这么轻易地分道扬镳吧?只见一个又一个昔日的队友离开了机房。
凭君莫话封侯事,一将功成万骨枯。
梦里,小$F$成了一个给将军送密信的信使。
现在,有两封关乎国家生死的密信需要送到前线大将军帐下,路途凶险,时间紧迫。小F不因为自己的祸福而避趋之,勇敢地承担了这个任务。
不过,小$F$实在是太粗心了,他一不小心把两封密信中的一封给弄掉了。
小$F$偷偷打开了剩下的那封密信。他发现一副十分详细的地图,以及几句批文——原来这是战场周围的情报地图。他仔细看后发现,在这张地图上标记了$n$个从$1$到$n$标号的 驿站,$n\sim 1$条长度为$1$里的小道,每条小道双向连接两个不同的驿站,并且驿站之间可以通过小道两两可达。
小$F$仔细辨认着上面的批注,突然明白了丢失的信的内容了。原来,每个驿站都可以驻扎一个小队,每个小队可以控制距离不超过$k$里的驿站。如果有驿站没被控制,就容易产生危险——因此这种情况应该完全避免。而那封丢失的密信里,就装着朝廷数学重臣留下的精妙的排布方案,也就是用了最少的小队来控制所有驿站。
小$F$知道,如果能计算出最优方案的话,也许他就能够将功赎过,免于死罪。他找到了你,你能帮帮他吗?当然,小$F$在等待你的支援的过程中,也许已经从图上观察出了一些可能会比较有用的性质,他会通过一种特殊的方式告诉你。
输入格式
从标准输入中读入数据。
输入第$1$行一个正整数$n,k,t$,代表驿站数,一支小队能够控制的最远距离,以及特殊性质所代表的编号。关于特殊性质请参照数据范围。
输入第$2$行至第$n$行,每行两个正整数$u_i,v_i$,表示在$u_i$和$v_i$间,有一条长度为一里的小道。
输出格式
输出到标准输出中。
输出一行,为最优方案下需要的小队数。
样例
样例输入1:
4 1 0
1 2
1 3
1 4
样例输出1:
1
样例输入2:
6 1 0
1 2
1 3
1 4
4 5
4 6
样例输出2:
2
数据范围与提示
样例$1$说明:
如图。由于一号节点到周围的点距离均是$1$,因此可以控制所有驿站。

样例$2$说明:
如图,和样例$1$类似。

数据范围:
子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解决一部分测试数据。
关于的含义如下:
$t=0$:该测试点没有额外的特殊性质;
$t=1$:保证最多$8$个点的所连接的小道超过$1$条;
$t=2$:保证所有点到$1$号点的距离不超过$2$。
每个测试点的数据规模及特点如下表:

题解
$5\%$算法:
$k=0$,直接输出$n$就好了。
时间复杂度:$\Theta(1)$。
期望得分:$5$分。
实际得分:$5$分。
$45\%$算法:
$k=1$,每个点只会被儿子$(0)$,自己$(1)$或父亲$(2)$控制,直接$DP$就好啦。
来看状态转移方程:
$dp[u][0]=\sum \min(dp[v][0],dp[v][1])-\min(0,\max(dp[v][1]-dp[v][0]))$
$dp[u][1]=\sum \min(dp[v])$
$dp[u][2]=\sum \min(dp[v][0],dp[v][1])$
时间复杂度:$\Theta(n)$。
期望得分:$45$分。
实际得分:$45$分。
$75\%$算法:
$k=2$
每个点被自己$(0)$,儿子$(1)$,孙子$(2)$控制;或者孙子和儿子全部被控制但是自己没有被控制$(3)$,孙子全部被控制但是自己和儿子不被控制$(4)$。
时间复杂度:$\Theta(n)$。
期望得分:$75$分。
实际得分:$75$分。
$90\%$算法:
依然是状态转移。
时间复杂度:$\Theta(n)$。
期望得分:$90$分。
实际得分:$90$分。
$100\%$算法:
考虑贪心。
让点按深度从大到小排序($BFS$序倒序即可)。
然后检查该节点是否被控制,如果没有被控制,就去驻扎他的$k$级父亲,肯定不劣。
因为$k$比较小,暴力更新即可。
时间复杂度:$\Theta(k\times n)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
$5\%$算法:
#include<bits/stdc++.h>
int n,k,t;
int main()
{
scanf("%d%d%d",&n,&k,&t);
printf("%d",n);
return 0;
}
$45\%$算法:
#include<bits/stdc++.h>
using namespace std;
struct rec
{
int nxt;
int to;
}e[200000];
int head[100001],cnt;
int n,k,t;
int dp[100001][3],du[100001];
bool vis[100001];
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
void dfs(int x)
{
vis[x]=1;
if(du[x]==1&&x!=1)
{
dp[x][1]=1;
dp[x][2]=0;
return;
}
dp[x][0]=dp[x][1]=dp[x][2]=0;
int minn=1<<30;
bool flag=0;
for(int i=head[x];i;i=e[i].nxt)
{
if(!vis[e[i].to])
{
dfs(e[i].to);
dp[x][1]+=min(dp[e[i].to][0],min(dp[e[i].to][1],dp[e[i].to][2]));
dp[x][2]+=min(dp[e[i].to][0],dp[e[i].to][1]);
if(dp[e[i].to][1]<=dp[e[i].to][0])flag=1;
else minn=min(minn,dp[e[i].to][1]-dp[e[i].to][0]);
}
}
dp[x][1]++;
if(flag)dp[x][0]=dp[x][2];
else dp[x][0]=dp[x][2]+minn;
}
int main()
{
scanf("%d%d%d",&n,&k,&t);
if(!k){printf("%d",n);return 0;}
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
du[x]++;
du[y]++;
add(x,y);
add(y,x);
}
memset(dp,0x3f,sizeof(dp));
dfs(1);
printf("%d",min(dp[1][0],dp[1][1]));
return 0;
}
$100\%$算法:
#include<bits/stdc++.h>
using namespace std;
struct rec
{
int nxt;
int to;
}e[200000];
int head[100001],cnt;
int n,k,t;
int que[100001],wzc[100001],fa[100001];
int ans;
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
void pre_bfs()
{
int he=1,ta=1;
que[1]=1;
fa[1]=1;
while(he<=ta)
{
for(int i=head[que[he]];i;i=e[i].nxt)
if(!fa[e[i].to])
{
que[++ta]=e[i].to;
fa[e[i].to]=que[he];
}
he++;
}
}
void change(int x)
{
if(!wzc[x])return;
for(int i=head[x];i;i=e[i].nxt)
if(wzc[e[i].to]<wzc[x]-1)
{
wzc[e[i].to]=wzc[x]-1;
change(e[i].to);
}
}
int main()
{
memset(wzc,-1,sizeof(wzc));
scanf("%d%d%d",&n,&k,&t);
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
pre_bfs();
for(int i=n;i;i--)
if(wzc[que[i]]==-1)
{
ans++;
int flag=que[i];
for(int j=k;j;j--)flag=fa[flag];
wzc[flag]=k;
change(flag);
}
cout<<ans;
return 0;
}
rp++
[洛谷P3942]:将军令(贪心)的更多相关文章
- [洛谷P3942] 将军令
洛谷题目链接:将军令 题目背景 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人/低头 念头/却能/让人/抬头 抬头/去看/去爱/去追 你心中的梦 题目描述 又 ...
- 洛谷 P3942 将军令 解题报告
P3942 将军令 题目描述 又想起了四月. 如果不是省选,大家大概不会这么轻易地分道扬镳吧? 只见一个又一个昔日的队友离开了机房. 凭君莫话封侯事,一将功成万骨枯. 梦里,小\(F\)成了一个给将军 ...
- 洛谷P3942将军令
啦啦啦,又是五月天的歌------ 题目传送门 那么来分析下题目;给定你一棵树,告诉你一支队伍能管辖的范围,求能覆盖整棵树的最少队伍数. 嘛,如果不会做,第一个想到的肯定是暴搜嘛,但是代码打起来肯定也 ...
- 洛谷 P3049 Landscaping ( 贪心 || DP)
题意 : 有n块土地,每块有A[i]泥土,现把其改造成B[i]泥土,有3种操作:(1)花费X向任意土地增加1泥土:(2)花费Y向任意土地减少1泥土:(3)花费Z*|i-j|把土地i的1泥土运到土地j. ...
- 洛谷P2831 愤怒的小鸟——贪心?状压DP
题目:https://www.luogu.org/problemnew/show/P2831 一开始想 n^3 贪心来着: 先按 x 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一 ...
- 洛谷 P6851 onu (贪心,模拟)
题意:C和D打牌,每张牌有花色和点数,小D刚开始的分数为\(v\),不管输还是赢,只要小D出了牌(花色必须相同),就能得到那张牌点数的分数,若是赢了(点数不小于D的牌),他可以另外加\(c\)分,输了 ...
- 洛谷P3602 Koishi Loves Segments(贪心,multiset)
洛谷题目传送门 贪心小水题. 把线段按左端点从小到大排序,限制点也是从小到大排序,然后一起扫一遍. 对于每一个限制点实时维护覆盖它的所有线段,如果超过限制,则贪心地把右端点最大的线段永远删去,不计入答 ...
- 洛谷P4155 [SCOI2015]国旗计划(贪心,树形结构,基数排序)
洛谷题目传送门 \(O(n)\)算法来啦! 复杂度优化的思路是建立在倍增思路的基础上的,看看楼上几位巨佬的描述吧. 首先数组倍长是一样的.倍增法对于快速找到\(j\)满足\(l_j+m\le r_i\ ...
- 洛谷P1084 疫情控制(NOIP2012)(二分答案,贪心,树形DP)
洛谷题目传送门 费了几个小时杠掉此题,如果不是那水水的数据的话,跟列队的难度真的是有得一比... 话说蒟蒻仔细翻了所有的题解,发现巨佬写的都是倍增,复杂度是\(O(n\log n\log nw)\)的 ...
随机推荐
- mongo(一)
入门文章地址:https://blog.csdn.net/muguli2008/article/details/80591256 按下面文件创建好文件下,然后执行下面的命令 mongod --port ...
- 浅读vuex源码,了解vuex基本原理
极简版vuex代码 class KVuex { constructor (options) { this.state = options.state this.mutations = options. ...
- luogu P4428 [BJOI2018]二进制
luogu 先考虑怎样的二进制串才会被3整除.可以发现如果二进制位第\(0,2,4...2n\)位如果为\(1\),那么在模3意义下为1,如果二进制位第\(1,3,5...2n+1\)位如果为\(1\ ...
- Java 里 如何使用Base64,网上都是废物的说法
百度搜索Java里如何使用Base64,结果很多文章都是让引用第三方Jar包,我靠我想了一下 他妈的Java里连这个都不提供,就直接忽略里那些废物的文章.继续搜索,算是找到答案: Java8以后 官方 ...
- 初识JavaScript对象
JavaScript对象语法.类型.属性 属性描述符(getOwnPropertyDescriptor().defineProperty()) [[Get]].[[Put]].Getter.Sette ...
- 不支持javascript的浏览器将JS脚本显示为页面内容
不支持javascript的浏览器将JS脚本显示为页面内容.为了防止这种情况发生,您可以使用这样的HTML注释标记:<html ><体><script type=“tex ...
- vue-app物理返回键跳到指定页面
例如提交订单成功跳到了订单详情页面,再返回就又到了提交订单支付页面 我们需要返回到其他页面 1.挂载完成后,判断浏览器是否支持popstate mounted(){ if (window.histor ...
- C++typedef struct和struct的区别
#include "pch.h" #include struct struct1 { int a; char b; char* c; }test1;//定义结构体变量 typede ...
- 解决GitLab的Forbidden和Nginx启动失败
通过宝塔安装的GitLab突然出现Forbidden,原因居然是IP并发过大,IP被禁 解决方法: 登录服务器,编辑文件 /etc/gitlab/gitlab.rb ,将下面的截图内容放开注释(默认 ...
- Perl环境安装
在我们开始学习 Perl 语言前,我们需要先安装 Perl 的执行环境. Perl 可以在以下平台下运行: Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, Sun ...