CF1003B Binary String Constructing 数学规律

2023-11-10 02:18

本文主要是介绍CF1003B Binary String Constructing 数学规律,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

You are given three integers aa bb and xx . Your task is to construct a binary string ss of length n = a + bn=a+b such that there are exactly aa zeroes, exactly bb ones and exactly xx indices ii (where 1 \le i < n1i<n ) such that s_i \ne s_{i + 1}sisi+1​ . It is guaranteed that the answer always exists.

For example, for the string "01010" there are four indices ii such that 1 \le i < n1i<n and s_i \ne s_{i + 1}sisi+1​ i = 1, 2, 3, 4i=1,2,3,4 ). For the string "111001" there are two such indices ii i = 3, 5i=3,5 ).

Recall that binary string is a non-empty sequence of characters where each character is either 0 or 1.

输入输出格式

输入格式:
 

The first line of the input contains three integers aa bb and xx 1 \le a, b \le 100, 1 \le x < a + b)1a,b100,1x<a+b) .

输出格式:
 

Print only one string ss , where ss is any binary string satisfying conditions described above. It is guaranteed that the answer always exists.

输入输出样例

输入样例#1 复制

2 2 1

输出样例#1 复制

1100

输入样例#2 复制

3 3 3

输出样例#2 复制

101100

输入样例#3 复制

5 3 6

输出样例#3 复制

01010100

说明

All possible answers for the first example:

  • 1100;
  • 0011.

All possible answers for the second example:

  • 110100;
  • 101100;
  • 110010;
  • 100110;
  • 011001;
  • 001101;
  • 010011;
  • 001011.

算法分析

比赛时时候两种做法都超时,第一种全排列,第二种先列出x-1个,还是不行,最后看别人网上的,才知道有个规律。

我们先假设a>b

如果给你个x,那么你至少需要x/2个01,然后发现如果x为奇数(x=5,   0101),那么会少两个不同点:如果x为偶数,那么会少一个不同点(x=6,  010101)。

X偶数时,肯定要01后加1,输出完1,在输出0.这样就可以获得一个不同点。

 

x奇数时,肯定要01后加0,输出完0,在输出1.这样也可以获得两个不同点。

注意只有0比较多的时候才能输出01,不然就是10.

改变题目条件:

打印出全部符号要求的公式,我的全排列就有用了。

教训:

题目规律要先找。

代码实现

#include<cstdio>  
#include<cstring>  
#include<cstdlib>  
#include<cctype>  
#include<cmath>  
#include<iostream>  
#include<sstream>  
#include<iterator>  
#include<algorithm>  
#include<string>  
#include<vector>  
#include<set>  
#include<map>  
#include<stack>  
#include<deque>  
#include<queue>  
#include<list>  
using namespace std;  
const double eps = 1e-8;  
typedef long long LL;  
typedef unsigned long long ULL;  
const int INF = 0x3f3f3f3f;  
const int INT_M_INF = 0x7f7f7f7f;  
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;  
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;  
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};  
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};  
const int MOD = 1e9 + 7;  
const double pi = acos(-1.0);  
const int MAXN=5010;  
const int MAXM=100010;
const int M=50010;int main()
{int a,b,w;while(scanf("%d%d%d",&a,&b,&w)!=EOF){int sum=a+b;int x,y;if(a<=b){swap(a,b);x=1,y=0;  }else {x=0,y=1;}for(int i=0;i<w/2;i++){cout<<x<<y;a--;b--;}if(w%2==0){while(b--) cout<<y;while(a--) cout<<x;}else{while(a--) cout<<x;while(b--) cout<<y;}cout<<endl;}return 0;
}

全排列代码实现:

#include<cstdio>  
#include<cstring>  
#include<cstdlib>  
#include<cctype>  
#include<cmath>  
#include<iostream>  
#include<sstream>  
#include<iterator>  
#include<algorithm>  
#include<string>  
#include<vector>  
#include<set>  
#include<map>  
#include<stack>  
#include<deque>  
#include<queue>  
#include<list>  
using namespace std;  
const double eps = 1e-8;  
typedef long long LL;  
typedef unsigned long long ULL;  
const int INF = 0x3f3f3f3f;  
const int INT_M_INF = 0x7f7f7f7f;  
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;  
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;  
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};  
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};  
const int MOD = 1e9 + 7;  
const double pi = acos(-1.0);  
const int MAXN=5010;  
const int MAXM=100010;
const int M=50010;int main()
{int a,b,x;while(scanf("%d%d%d",&a,&b,&x)!=EOF){int i;int n[210];for( i=0;i<a;i++)n[i]=0;for(;i<a+b;i++)n[i]=1;do{int ans=0;for(int j=0;j<a+b-1;j++){if(n[j]!=n[j+1])ans++;}	if(ans==x) break;}while(next_permutation(n,n+a+b));for(i=0;i<a+b;i++)cout<<n[i];cout<<endl;}return 0;
}

 

这篇关于CF1003B Binary String Constructing 数学规律的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/379825

相关文章

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

计蒜客 Half-consecutive Numbers 暴力打表找规律

The numbers 11, 33, 66, 1010, 1515, 2121, 2828, 3636, 4545 and t_i=\frac{1}{2}i(i+1)t​i​​=​2​​1​​i(i+1), are called half-consecutive. For given NN, find the smallest rr which is no smaller than NN

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18