[ABC271D] Flip and Adjust Solution

更好的阅读体验戳此进入

题面

给定 n 张卡片,正面是 ai,背面是 bi,给定 S 要求构造方案钦定这 n 张卡片选择正面的数或反面的数,使得求和后洽等于 S,无解输出 No,反之输出 Yes 并输出任意方案。

Solution

一般的思路都是 DP 同时记录决策点然后最后跑一遍答案,不过这样还需要动脑,本题范围较小不如暴力一点,我们直接在 DP 过程中的每一个状态记录所有牌的正反,最开始的思路是开一个 bitset 这样多出来的复杂度是 O(nw) 也就是 O(1),不过仔细一想这东西直接开个 basic_string < char > 无脑维护就行了,这样转移会多一个复制的 O(n),空间也会多一个 O(n),最终时空复杂度都是 O(n2S),刚好 1e8

转移显然:

dp(i,j)=dp(i1,jai)+H
dp(i,j)=dp(i1,jbi)+T

然后中间判断一下是否能转移,也就是 dp[i][j].size() 是否为 i,以及 jai0jbi0 即可。

Code

UPD

update-2023_02_09 初稿。

update-2023_02_09 修改一些不符合规范的地方。(另外他这个 “句子末尾应加句末句号(全角)” 我实在是没找到哪里缺句号了,只能在 “初稿” 这个非句子的词语后加了个句号。