Codeforces Round #704 (Div. 2) Genius‘s Gambit

这篇博客探讨了一种二进制组合问题,给定a个0和b个1,要求构造两个二进制数,使得它们相减的结果包含k个1。文章通过分析样例发现了关键规律,并提供了C++代码实现来检查是否存在满足条件的数字对。当k大于a+b-2,b小于2或a小于1时,不存在满足条件的解。反之,如果能构造出一个长度为k+1的字段,则存在解决方案。
摘要由CSDN通过智能技术生成

传送门
一、题意: 给出a个0和b个1,组合出两个含有a个0和b个1的数的二进制形式,并且最高位不为0,问是否存在两个数相减的结果中含有k个1。若存在输出Yes和这两个数,否则No。
二、思路: 经过构造样例可以发现一个规律:
1…0
0…1
假设该数二进制长度为len,省略号位置若对应的位置同为1或者同为0,此时相减将会得到len-1个1。
所以只需要能够构造出一个长度为k+1的字段,就存在这样的两个数字。
cpp代码

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#include<stack>
#include<string>
#include<set>
#include<cmath>
#include<map>
#define ll long long
using namespace std;
const ll mod = 998244353;
const int inf = 1e9 + 7;
int ans1[200005], ans2[200005];
int main()
{
	int a, b, k;
	cin >> a >> b >> k;
	if (k == 0) {
		printf("Yes\n");
		for (int i = 1; i <= b; i++)printf("1");
		for (int i = 1; i <= a; i++)printf("0");
		printf("\n");
		for (int i = 1; i <= b; i++)printf("1");
		for (int i = 1; i <= a; i++)printf("0");
	}
	else if (k > a + b - 2||b<2||a<1)printf("No");
	else {
		int flag = 0;
		for (int i = 1; i <= b; i++)ans1[i] =ans2[i]= 1;
		for (int i = b+1; i <= a+b; i++)ans1[i]=ans2[i] = 0;
		for (int i = 2; i <= a+b; i++) {
			if (ans2[i + k] == 0&&ans2[i]==1) {
				flag = 1;
				swap(ans2[i], ans2[i+k]);
				break;
			}
		}
		if (!flag)printf("No");
		else {
			printf("Yes\n");
			for (int i = 1; i <= a + b; i++)printf("%d", ans1[i]);
			printf("\n");
			for (int i = 1; i <= a + b; i++)printf("%d", ans2[i]);
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值