Atcoder Beginner Contest 326 (ABC326)

文章涉及多种编程竞赛题目,包括使用模拟、双指针、DFS解决ABCPuzzle,概率转移在RevengeofTheSalaryofAtCoderInc.中的应用,以及利用网络流模型求解RobotRotation和UnlockAchievement问题。
摘要由CSDN通过智能技术生成

不知道为什么拖到现在,我是摆怪。

A. 2UP3DOWN

模拟,略。

B. 326-like Numbers

模拟,略。

C. Peak

双指针板子。

D. ABC Puzzle

基础 dfs。
但是赛时不知道为什么觉得状态数不会很少,于是写了一个巨大复杂的状压。这里粗略算算有效状态数:
仅考虑每行的限制,有 \(\binom{5}{3}=10\) 种选择填数位置的方法。又因为第一个数填什么是固定的,选定位置后只有 \(2\) 种不同填法。那么每行的有效状态数为 \(20\)
也就是说总的状态数最多只有 \(20^5\),当然这里没有考虑列的限制,实际上合法状态远比这个少。所以直接 dfs 是能过的。

E. Revenge of "The Salary of AtCoder Inc."

\(f_i\) 表示游戏能进行到 \(x=i\) 的概率,则答案是 \(\sum a_i f_i\)
观察到 \(x\) 在游戏过程中单调递增,则有转移 \(f_i=\frac{1}{n} \sum\limits_{j=1}^{i-1} f_j\)

F. Robot Rotation

Description

有一个机器人位于坐标系原点 \((0,0)\),面向 \(x\) 轴正方向。
在每一秒开始前,你可以选择让这个机器人向左或向右旋转 \(90\) 度,不可以不转。接下来,机器人沿它面对的方向前进 \(a_i\) 个单位距离,\(i\) 为当前秒数。
给定总时间 \(N\),序列 \(a\) 和机器人最终的位置 \((X,Y)\)。请构造一个合法的操作序列(用 LR 表示每步操作的方向),或判断无解。

\(N\le 80,\,a_i\le 10^7,\,-10^9\le X,Y\le 10^9\)

Solution

因为不能不转弯,可以发现机器人一定是横竖交替行走的。进一步观察,发现奇数秒机器人只改变 \(y\) 坐标,否则只改变 \(x\) 坐标。
那么 \(x,y\) 坐标是互不影响的,这启发我们把横纵坐标分开考虑。这里以横坐标为例,设序列 \(a\) 的所有偶数位组成序列 \(b\)
问题转化为给一个序列 \(b\),可以自由选择每个 \(b_i\) 的正负号,问是否存在方案使 \(X=\sum b_i\)
这看起来像是值域极大的 01 背包,显然不太可做。从数据范围的角度考虑问题,\(b\) 的长度至多只有 \(40\)
考虑将序列 \(b\) 拆成前后两部分,则每一半只有 \(20\) 个数,对应着 \(2^{20}\) 种状态。我们求出前一半的所有状态存进 map,在枚举后一半状态为 \(x\) 时判断 \(X-x\) 是否在 map 中存在即可。
时间复杂度 \(O(\frac{n}{4}\times 2^{\frac{n}{4}})\)

G. Unlock Achievement

完全没想到网络流(

Description

\(n\) 个技能,\(m\) 个成就。每个技能有一个等级,初始均为 \(1\)
你可以用 \(c_i\) 块钱令技能 \(i\) 提升一个等级,该操作没有次数限制。
\(i\) 个成就达成的条件是对于 $\forall j\in [1,n],level_j \ge L_{i,j} $,其中 \(level_j\) 表示第 \(j\) 个技能的等级。达成成就 \(i\) 后,你会获得 \(a_i\) 元的奖励。注意这里奖励与成本是分开的,也就是说你不能用奖励的钱去提升等级。
请最大化获得的奖励与所需成本之差,并输出该值。

\(n,m\le 50,\, 1\le L_{i,j}\le 5,\, 1\le a_i,c_i\le 10^6\)

Solution

考虑构造最小割模型。

因为 \(L_{i,j}\le 5\),把点 \(i\) 拆成 \(6\) 个点,分别为 \(id_{i,j}(j\in [1,6])\)。令成就 \(i\) 为点 \(bel_i\)。则进行如下的建图:

  • 连接源点 \(s\)\(id_{i,6}\),容量为 \(\inf\)
  • 连接 \(id_{i,j+1}\)\(id_{i,j}\),容量为 \(c_i\times (j-1)\),割掉这条边则表示将技能 \(i\) 升级到 \(j\)
  • 连接 \(id_{i,L_{j,i}}\)\(bel_j\),容量为 \(\inf\)
  • 连接 \(bel_i\)\(t\),容量为 \(a_i\)。如果这条边被割掉,说明至少有一个技能的等级未达到该奖励的条件,不能获得奖励。

那么这个图的最小割就是成本与未获得的奖励之差,用总奖励减去最小割即为答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值