一道模拟二进制的题

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,模拟)

2021 ICPC沈阳 J.Luggage Lock(bfs,模拟)

第十四届蓝桥杯第二期模拟赛参考解析 (Java版)

10.25 AHSOFNU 校内模拟

第十四届蓝桥杯模拟赛(第一期)——C语言版

2017/10/25模拟赛