DAY3共2题:
旅游
tokitsukaze and Soldier
? 作者:Eriktse
? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?
? 原文链接(阅读原文获得更好阅读体验):
题目传送门:https://ac.nowcoder.com/acm/problem/15748
该题主要考察对树的理解,以及简单的树上dp和贪心算法。
我们将会住的节点标记为1,其余不住的节点标记为0。
我们可以发现,根节点(s)是一定会标记为1的,那么剩下的节点该怎么分配可以使得标记为1的节点数最多呢?
当我们在某个点x标记时,我们可以发现它的父亲、儿子们都不能再被标记了。但是点x的兄弟却不受影响,接下来考虑一下哪些节点的兄弟多呢?应该是叶子节点。
所以我们可以想到首先将根节点和叶子结点全部都标记为1,然后遍历整棵树,如果某个点的父亲和儿子们都没被标记,那么他也可以被标记为1。
注意考虑特殊情况,比如只有一个点的树,只有两个点的树....
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 5e5 + 9, inf = 8e18;
bitset<maxn> sel;
vector<int> g[maxn];
int n, s;
void dfs(int x, int pre)
{
//如果到了叶子节点,就直接标记并返回
//这里sel[x] = !sel[pre]是考虑到叶子的深度可能为2(即叶子的父亲就是根)
//此时根一定被标记,那么叶子就不能被标记
//如果是一般情况,那么父亲肯定不会被标记(因为父亲的标记需要儿子处理完成之后再决定)
//自己就打上标记
if(g[x].size() == 1 and x != s)return sel[x] = !sel[pre], void();
bool tag = true;//tag == true表示当前点可以被标记
if(x == s)sel[x] = true;//根一定被标记
else if(sel[pre])tag = false;//如果父亲被标记了,那么当前点一定不能被标记
//看看儿子们是否被标记
for(auto &y : g[x])
{
if(y == pre)continue;
dfs(y, x);
if(sel[y])tag = false;
}
sel[x] = tag;
}
signed main()
{
scanf("%lld %lld", &n, &s);
for(int i = 1;i < n; ++ i)
{
int x, y;scanf("%lld %lld", &x, &y);
g[x].push_back(y), g[y].push_back(x);
}
dfs(s, 0);
int ans = 0;
for(int i = 1;i <= n; ++ i)
if(sel[i])ans ++;//统计标记的点的个数
printf("%lld\n", ans);
return 0;
}
做完这道题,我们可以总结一点点对于树上dp这一类题的经验技巧:
1.将特殊点作为根,建立一棵树,建树一般用双向边,边的条数严格等于点的个数-1。
2.优先考虑树中特殊的点,比如根、叶子。
3.不要忘记考虑特殊情况,比如一条链状的树(此时注意根是否会被判定为叶子、注意复杂度是否会爆)、仅有1个点的树(可能需要特判)。
题目传送门:https://ac.nowcoder.com/acm/problem/50439
这题主要考察贪心+优先队列维护区间k个最值。
我们观察题目可以发现,当我们枚举到一个士兵的要求是"队伍人数不能超过s[i] = k"时,那么此时军队的战斗力最大值应该是所有s >= k的军人中的最大的k个军人的战斗力之和。
我们可以考虑用一个优先队列维护最大的k个值之和(小根堆,每次弹出最小值,即可维护最大值之和),然后通过限制“遍历方式”使得当遍历到第i个人(s[i] = k)时,优先队列里的所有值对应的s都是>= k的,这样就只需要求出优先队列里最大的k个数字之和即可,这个遍历方式就是按照s[i]降序排列,然后从前往后遍历。
我们可以维护一个大小始终等于s[i]的优先队列,因为s[i]为降序,所以这个优先队列的元素个数的最大值是一直在减小的,减小的时候只需要弹出最小的元素即可,用一个变量sum维护优先队列里的所有元素之和(push时加上,pop时减去)。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e5 + 9;
struct Node
{
int v, s;
}a[maxn];
signed main()
{
int n;scanf("%lld", &n);
for(int i = 1;i <= n; ++ i)scanf("%lld %lld", &a[i].v, &a[i].s);
sort(a + 1,a + 1 + n, [](const Node &u, const Node &v)
{
return u.s > v.s;
});
priority_queue<int, vector<int>, greater<int> > pq;
int ans = 0, sum = 0;
for(int i = 1;i <= n; ++ i)
{
sum += a[i].v, pq.push(a[i].v);
while(pq.size() > a[i].s)sum -= pq.top(), pq.pop();
ans = max(ans, sum);
}
printf("%lld\n", ans);
return 0;
}
经验总结:
1.用某种遍历方式来限制某个条件,比如本题用"降序"来限制在当前点之前的所有点的s[i]都比当前的大或相等。
2.优先队列可以维护区间的k个最值之和,只适用于连续的查询且k只能变小或不变,因为变大的话,不知道要将哪一个放进去。
感谢大家的阅读,欢迎大家跟我一起刷题呀!
? 本文由eriktse原创,创作不易,如果对您有帮助,欢迎小伙伴们点赞?、收藏⭐、留言?
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
我有一个任务列表(名称、starts_at),我试图在每日View中显示它们(就像iCal)。deftodays_tasks(day)Task.find(:all,:conditions=>["starts_atbetween?and?",day.beginning,day.ending]end我不知道如何将Time.now(例如“2009-04-1210:00:00”)动态转换为一天的开始(和结束),以便进行比较。 最佳答案 deftodays_tasks(now=Time.now)Task.find(:all,:conditio
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标
网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.
什么是0day漏洞?0day漏洞,是指已经被发现,但是还未被公开,同时官方还没有相关补丁的漏洞;通俗的讲,就是除了黑客,没人知道他的存在,其往往具有很大的突发性、破坏性、致命性。0day漏洞之所以称为0day,正是因为其补丁永远晚于攻击。所以攻击者利用0day漏洞攻击的成功率极高,往往可以达到目的并全身而退,而防守方却一无所知,只有在漏洞公布之后,才后知后觉,却为时已晚。“后知后觉、反应迟钝”就是当前安全防护面对0day攻击的真实写照!为了方便大家理解,中科三方为大家梳理当前安全防护模式下,一个漏洞从发现到解决的三个时间节点:T0:此时漏洞即0day漏洞,是已经被发现,还未被公开,官方还没有相
一、机器人介绍 此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接
目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'
技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进
我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s