AtCoder Beginner Contest 281 (A-F,口胡G)青大acmer 日常vp

A - Count Down
输出小于等于 n n n的数
代码

B - Sandwich Number
题意 问字符串是否是第一个和最后一个字符是大小写,中间的字符是 100000 − 99999 100000-99999 10000099999之间的数字。
暴力模拟即可,需要注意的例子是 A 0100000 A A0100000A A0100000A
代码

C - Circular Playlist
题意 给你一个循环的时间安排表,给你时间,问你最后在哪个活动,做了多长时间。
考察了取模,取模后看看模数在哪个活动即可
代码

D - Max Multiple
题意 给你n个数,选k个数能组成d的最大倍数,问这个倍数为多少
思路:考虑dp,我们把d的倍数看成对 d d d取模为0,然后转化为模数问题,然后暴力dp即可。
代码

E - Least Elements
题意 问你所有长度为 m m m的区间前k个数的和并打印出来。
思路 两种做法
1.对顶堆暴力判断,我们每次把在区间外的删除,然后加到一个堆上,调整堆,让第一个堆的大小为 k k k
即可。
调整思路: 如果第一个堆的大小小于k,我们从第二个堆最小的一个一个拿过来,大于k的话就把第一个堆最大的数一个一个放到第二个堆即可,代码也好些,思路比较好想。
2.树状数组模拟即可。
第二种思路代码

F - Xor Minimization
题意 给你一个 a a a数组,任取 x x x,求所有数的异或和最大的最小值。
图例:
在这里插入图片描述

思路:看到异或自然想到拆位,很容易发现这是一道字典树方向的题目,继续思考,发现一个性质,考虑在字典树上dfs,因为当我们选择了 x x x这一位取0时,我们可以显而易见的发现,这一位为0的一定不可能为最大值,我们就往1上遍历 (完全不用考虑0子树的情况) 。仔细推敲可以发现一种比较好写的写法。
我们遍历字典树的时候,如果这个子树(考虑小于等于 k k k位的情况)如果两个子树( 0 0 0子树和 1 1 1子树)都存在的话,那我们往哪递归都一定让答案第 k k k为1,有一个子树为空,答案可以走到不为空的子树让答案为0,暴力dfs即可。
我写了一种比较好写的递归,核心代码如下

void dfs(int u , int k , int ans){
	if(k == -1) {
		tot = min(ans , tot) ; 		
	}
	else {
		if(son[u][0]) 
			dfs(son[u][0] , k - 1 , ans | ((son[u][1] != 0) << k) ) ;
		if(son[u][1])
			dfs(son[u][1] , k - 1 , ans | ((son[u][0] != 0) << k) ) ; 
	}
}

代码

G - Farthest City
vp时没时间去写这道题了,但是想到了一个很好想而且非常好实现的代码,由于本人懒没有写 ,接下来就是口胡思路 。

题意
给你一个大小为 n n n的子树,问你图的数量,图满足1到除 n n n之外的点的距离都严格小于到其他点的距离。
思路 看到这个题,首先一个比较快的想法是要先建树,与最短路相关的树就是最小路径树,我们考虑最小路径树的建立方式,我们为了不会重复计数,我们可以一层一层地有标号计数去统计答案,由于题目要求的是图的数量,我们肯定会存在非树边,手玩也可以发现非树边一定是在同一层或相邻层之间的两个节点之间建立的,也是一种横叉边的说法,这个时候用到了相邻层的数量,所以考虑维护当前层和相邻层的数量, d p dp dp的建立方式也就出来了,我们考虑 d p dp dp为当前已经包含了 n n n个节点,上一层有 m m m个节点,当前层有 k k k个节点的方案数,值得需要注意的是我们第 n n n个点一定最后加而且一定加到层的最后面。
然后考虑 d p dp dp转移,我们dp转移考虑两个方面
1.加到当前层 d p [ n ] [ m ] [ k ] dp[n][m][k] dp[n][m][k]肯定是由 d p [ n ] [ m ] [ k − 1 ] dp[n][m][k - 1] dp[n][m][k1]转移过来,然后可以选择的操作是,加到当前层一定是由上一层转移过来,我们可以选择上一层的多个节点(不能为0)连接起来,方案数是 2n - 1 ,减去了都不选的情况。同一层的我们可以选择若干条连接(可以为空) , 方案数为 2n,然后就是标号的选择是 N N N- n n n
2.如果考虑成为最高的一层(加到当前最大的一层),转移为 d p [ n ] [ m ] [ 1 ] dp[n][m][1] dp[n][m][1],由dp[n][k][m]转移过来,这一步转移是 O ( m ) O(m) O(m)的过程,总共只有 O ( n 2 ) O(n^2) O(n2)次不影响时间复杂度。然后非树边的连接方式类似。
最后考虑 n n n的连接和上述的第二步类似,直接输出方案即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值