【思维题】CodeForce 1003B Binary String Constructing

版权声明:Johnson https://blog.csdn.net/m0_38055352/article/details/91630140

这段时间要沉迷刷题一段时间了,就让CSDN陪我一起吧!

一、题目大意

题目意思就是给定三个数a,b,x,其中a表示待构造的字符串中有a个0,b表示待构造的字符串中有b个1,x表示待构造的字符串有x次跳转('01’和’10’称为一次跳转)。

二、题目思路以及AC代码

我发觉codeforce上题目的难度分数真的很准,1500以下,怎样都能想出来,1800以上就死费脑筋还不一定有思路… 其实我就是菜。

然后说说这道题,这道题我一开始就是想着找规律,对于这种题,我已经放弃了穷举法的尝试。要求构造跳转,而且题目中也说了,有多种构造方法,只要构造出来满足要求就可以,那么我们就可以考虑自己的构造思路了。

我说一下我的构造思路。首先对于给定的a和b要判断其大小,然后要让a和b中大的数对应的字符开头,这是有原因的,因为比如我给你a为4,b为2,x为4,这里比较大的是a,所以我就需要用0开头,010100满足要求,但如果我用1开头的话,无论如何也是无法满足要求的,因为用1开头,跳转次数最多的也就是101000,3次。

好,上面是构造的第一个条件,然后看第二个。这其实是找规律找出来的,对于给定的x,首先计算x/2,记为p,设前面找到数量较多的字符为c,数量较少的字符为d,那么先在结果字符串中添加p个cd,然后如果x是奇数,那么首先把剩下个数的c添加到字符串后,最后添加剩下的d,如果x是偶数,那么首先把剩下个数的d添加到字符串后,最后添加剩下的c,至于这样做的原因嘛,只能说找规律找出来就是这个样子,然后就AC了,我也就没有费力的去证明了。

下面给出AC代码:

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int a, b, x;

int main()
{
	cin >> a >> b >> x;

	string ans = "";
	char c, d;
	if (a < b) {
		int tmp = b;
		b = a;
		a = tmp;
		c = '1'; d = '0';
	}
	else {
		c = '0'; d = '1';
	}
	
	// a是较大的字符的个数  c是较大的字符
	int p = x / 2;
	for (int i = 0; i < p; i++) {
		ans += c;
		ans += d;
	}
	if (x & 1) {
		for (int i = 0; i < a - p; i++) {
			ans += c;
		}
		for (int i = 0; i < b - p; i++) {
			ans += d;
		}
	}
	else {
		for (int i = 0; i < b - p; i++) {
			ans += d;
		}
		for (int i = 0; i < a - p; i++) {
			ans += c;
		}
	}

	cout << ans << endl;

    return 0;
}

如果有问题,欢迎大家指正!!!

猜你喜欢

转载自blog.csdn.net/m0_38055352/article/details/91630140