本帖最后由 C0mp1ler 于 8-11-2025 23:06 编辑
USACO 25OPEN SILVER1算法与知识点 1. 位运算与二进制:左移一般等效于 * 2;异或的性质 2. 贪心:直接优先保证 popcount 异或为 K 且和最小,先不考虑数列之和 思路 l 理解题目 题目要求构造一个非负整数序列,使得: 所有元素和为 M; 每个数二进制中1的数量 (popcount) 按位异或的结果为 K; 元素个数 N 不超过100。 直接暴力搜索很难,因为 M 和 K 会很大 l 贪心:构造满足 popcount 异或为 K 的最小和序列 利用 (1<<(1<<bit))−1 构造每个元素,使该元素的 popcount 恰为2**bit ,且数值最小。 例:k=5=0b101 a = [1, 15] 这样构造的序列满足 popcount 异或等于 K,且和尽可能小,方便后续调整。 l 调整使得和=M 构造的序列 a 和 M 可能不等:difference = M - sum(a)。 分类讨论: l 当差值为负,说明无法构造; l 当差值为零,直接返回; l 当差值为正,则要补充一组数 b,要求: n 它们的 popcount 异或为0(不影响原来的异或结果); n 它们的和为差值。 n 通过实验,得到:两个相等数字的 popcount 异或为0。(二进制每位均相等) n 差值为偶数时,用两个相等数字平分差值即可。 n 差值为奇数时,通过增加 1 和 2(popcount 都是1,异或为0),并加两个相等的数字,保证总和和异或满足。
|