CSP-J 2026 第二轮入门组真题解析(第三题
- 2026-11-01 15:48:03
CSP-J 2026 第二轮入门组真题解析(第三题
CSP-J 2026 第二轮入门组真题解析(第三题
今年 CSP-J 入门组第三题,考的是从 n 个数里选 m 个,让它们按位与的结果最大。这题最妙的解法不是枚举,而是从高位到低位逐位贪心。
按位与的规则很简单:同为 1 才留 1,有一个 0 就变 0。你可以把它想成寻宝——每个数字是一把钥匙,每一位是一种宝石,两把钥匙相与,只有共同拥有的宝石才能留下。
数据范围是 n≤2×10^5,枚举肯定超时。真正的思路是从最高位开始往下试:假设当前答案的某一位能变成 1,就去遍历所有数字,统计有多少个数字包含这一位。如果符合条件的数字不少于 m 个,就把这一位保留下来;不够就放弃,继续试下一位。
为什么这样贪心一定对?因为高位的 1 价值永远大于右边所有低位之和。比如 1000(8)就比 0111(7)大,所以必须优先保住高位。
这套算法只遍历 30 个二进制位,时间复杂度是 O(30n),完全跑得动。写代码时最容易踩三个坑:从低位开始试、只判断有没有一个数符合而忘了 cnt>=m、把按位与 & 写成逻辑与 &&。
要不要我帮你找几道同类的“逐位贪心”练习题,趁热打铁练一练?
原文CSP-J 2026 第二轮入门组真题解析(第三题 、按位与(and))
山东,3小时前,
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。