题解:CF437B The Child and Set
1.洛谷 P4969 神秘的703 题解2.洛谷 P8059 [POI2003] Monkeys 题解3.UVA198 Peter's Calculator 题解4.UVA1400 "Ray, Pass me the dishes!" 题解5.UVA11504 Dominos 题解6.P5686 [CSP-S2019 江西] 和积和 题解7.UVA353 Pesky Palindromes 题解8.P1399 [NOI2013] 快餐店 题解9.UVA10091 The Valentine's Day 题解10.题解:P10838 『FLA - I』庭中有奇树11.题解:P10837 『FLA - I』云音泛
12.题解:CF437B The Child and Set
13.题解:UVA1456 Cellular Network14.题解:P8113 [Cnoi2021] 自我主义的平衡者15.题解:AT_arc147_e [ARC147E] Examination16.P8564 ρars/ey 题解17.P8563 Magenta Potion 题解18.P8474 「GLR-R3」立春 题解19.P8475 「GLR-R3」雨水 题解20.题解:P4288 [SHOI2014] 信号增幅仪CF437B The Child and Set 题解
这题目就一个问题。
啥是 ?
是指 的二进制表示中最低位的 所表示的值。
例如 ,其中最低位的 在第二位,表示 ,即 。
接下来考虑如何选取。
一个贪心策略是按照 从大到小选取,如果当前的数的 小于剩余的 ,那么就选到这个数,并让 减去当前数的 。
显而易见这样取出来的总和最大。
如果取到最后还不能取完,那么就输出 -1
。
有点类似于倍增。
至于怎么求 ,先人给我们找好了方法:
这是利用计算机补码性质完成的,其中的符号 代表按位与。
最终代码如下:
#include<bits/stdc++.h>
#define MAXM 100010
using namespace std;
struct node{
int num, bit;
};
bool operator < (node a, node b){ return a.bit < b.bit; }
bool operator > (node a, node b){ return a.bit > b.bit; }
node a[MAXM];
int n, m;
vector<int> ans;
int main(){
scanf("%d%d",&n,&m);
for(int i = 1; i <= m; i++) a[i] = (node){i, i & (-i)};
sort(a + 1, a + m + 1, greater<node>());
for(int i = 1; i <= m && n >= 0; i++){
if(n >= a[i].bit){
n -= a[i].bit;
ans.push_back(a[i].num);
}
}
if(n != 0) printf("-1\n");
else{
printf("%ld\n",ans.size());
for(int i = 0; i < ans.size(); i++) printf("%d ",ans[i]);
printf("\n");
}
return 0;
}
合集:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具