一道模拟二进制的题
Posted spzjc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道模拟二进制的题相关的知识,希望对你有一定的参考价值。
Codeforces Round #731 (Div. 3) D. Co-growing Sequence
题意:定义一个数列an是growing的,则对于2≤i≤n都满足ai & ai−1=ai
给出数组xn,要求字典序最小的yn满足zn=xn xor yn数列zn是growing的。
对于100%的数据1≤n,∑n≤2×105,1≤xi≤230
思路:模拟二进制,第一位必定是0才能保证最小,之后的数字都是确定的,根据前一位递推得出即可。
代码如下
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,t;
int a[200005], ans[200005];
int qmi(int n, int k) {
int ans = 1;
while (k) {
if (k & 1) {
ans *= n;
}
n = n * n;
k >>= 1;
}
return ans;
}
int f(int x, int y) {
int sum = 0;
int xx[35], yy[35];
memset(xx, 0, sizeof(xx));
memset(yy, 0, sizeof(yy));
int cntx = 0, cnty = 0;
while (x) {
xx[++cntx] = x % 2;//十进制转二进制的模拟
x = x / 2;
}
while (y) {
yy[++cnty] = y % 2;
y = y / 2;
}
for (int i = 1; i <= 31; i++) {
if (xx[i] == 1 && yy[i] == 0)//若前一个有1,而后一个为0时,为了让后一个的0转为1,根据异或规则,需要补充一个1
sum += qmi(2, i - 1);
}
return sum;
}
int main() {
cin >> t;
while (t--) {
ans[1] = 0;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 2; i <= n; i++) {
ans[i] = f(a[i - 1], a[i]);//算出来当前位置的应异或的数字
a[i] = a[i] ^ ans[i];//更新当前两个数字异或操作后的数字
}
for (int i = 1; i <= n; i++)
cout << ans[i] << " ";
cout << endl;
}
}
2019.08.06模拟赛T2
题目大意
已知三个$n$位二进制数$A$,$B$,$C$.
满足:
$A+B=C$
它们二进制位中$1$的个数分别为$a$,$b$,$c$.
求满足条件的最小的$C$.
Solution
唉,又是一道随缘猜结论的题,可惜极限数据卡掉了我一个点,开大数组就A了.....
通过打表,我们发现所有的最优解中都有一种情况是$A$的二进制位的$1$是连续一段。
以上是关于一道模拟二进制的题的主要内容,如果未能解决你的问题,请参考以下文章
2021 ICPC沈阳 J.Luggage Lock(bfs,模拟)