Compatible Numbers
Compatible Numbers
思路
对于一个数
- 如果当前位是 0,那么
这一位可以填 - 如果当前位是 1,那么
这一位可以填
那么对于用这种方式构造出来的数的一些位是可以互换的,而互换后的数显然也是满足要求的,所以问题就变成了,
对于用上面的方法构造出来的数,如果当前数的二进制的某一位是 1,那么根据上面的规则,你不能将它变成 0,因为会多出一些可能,有后效性,但是对于某一位是 0, 它是不会多出新的方案的,那么我们就可以判断说通过上面的方法构造出来的数的最大值,是否可以被
然后对于每一个数(
然后搜索部分是可以用 dp 来实现的,所以将搜索换成 dp 即可。
记
注:互换就是说那一位取反。
code
点击查看代码
#include <iostream> using namespace std; const int MaxN = 1e6 + 10, MaxM = 9e6 + 10; int dp[MaxM], a[MaxN], n; int main() { ios::sync_with_stdio(0), cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i], dp[a[i]] = a[i]; } for (int i = 0; i < MaxM; i++) { if (dp[i]) { for (int j = 0; (1 << j) < MaxM; j++) { if (!(i & (1 << j)) && (i | (1 << j)) < MaxM) { dp[(i | (1 << j))] = dp[i]; } } } } for (int i = 1; i <= n; i++) { cout << (dp[((1 << 22) - 1) ^ a[i]] ? dp[((1 << 22) - 1) ^ a[i]] : -1) << " "; } return 0; }
本文作者:yabnto
本文链接:https://www.cnblogs.com/ybtarr/p/17612410.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步