hiho 挑战赛10(01串-找规律决策)

题目1 : 01串

时间限制:7000ms

单点时限:1000ms

内存限制:256MB

描述

给定两个整数n和m,求是否存在恰好包含n个0和m个1的01串S,使得S中不存在子串"001"和"11"。

如果存在符合条件的01串则输出字典序最小的S,否则输出NO。

输入

一行两个整数,表示n和m。(0<=n,m<=100000,0<n+m)

输出

一行一个字符串,为字典序最小的S或者NO。

样例输入
2 3
样例输出
10101

本题的关键在找规律

显然一旦出现 ’00‘ 后面不能有1

不能出现‘11‘ 那么1 必然单个出现

那么相邻的1之间有多少个0?

然后具体试试就胡乱贪出来了

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (200000+10)
typedef long long ll;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int n,m,a[MAXN];
int main()
{
//	freopen("A.in","r",stdin);
//	freopen(".out","w",stdout);

	scanf("%d%d",&n,&m);
	int s=n+m;

	a[0]=2,a[s+1]=2;

	For(i,s)
	{
		if (a[i-1]==1) a[i]=0,n--;
		else if (i>1 && a[i-1]==0 && a[i-2]==0 ) a[i]=0,n--;
		else if (m>(s-i+1)/2+(s-i+1)%2)
		{
			cout<<"NO"<<endl;
			return 0;
		}
		else if (m>(s-i)/2+(s-i)%2)
		{
			a[i]=1,m--;
		}
		else if (a[i-1]==0 && m )
		{
			a[i]=1,m--;
		}
		else
		{
			if (n) a[i]=0,n--;
			else a[i]=1,m--;
		}

		if (n<0||m<0)
		{
			cout<<"NO"<<endl;
			return 0;
		}
	}

	For(i,s)
		printf("%d",a[i]);

	cout<<endl;
	return 0;
}
时间: 2024-08-01 22:35:10

hiho 挑战赛10(01串-找规律决策)的相关文章

ACM学习历程——hihoCoder挑战赛10A 01串(策略)

时间限制:7000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个整数n和m,求是否存在恰好包含n个0和m个1的01串S,使得S中不存在子串"001"和"11". 如果存在符合条件的01串则输出字典序最小的S,否则输出NO. 输入 一行两个整数,表示n和m.(0<=n,m<=100000,0<n+m) 输出 一行一个字符串,为字典序最小的S或者NO. 样例输入 2 3 样例输出 10101 由于不能存在001和11,故只能1010

hdoj 2047 阿牛的EOF牛肉串 【找规律】

这道题再一次证明找规律真不是我的强项.... 阿牛的EOF牛肉串 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20312    Accepted Submission(s): 9528 Problem Description 今年的ACM暑期集训队一共有18人,分为6支队伍.其中有一个叫做EOF的队伍,由04级的阿牛.XC以及05级

HDU ACM 1041Computer Transformation(大数模拟+找规律)

分析:大数模拟和找规律. #include<iostream> using namespace std; char f[1001][501]; /* 从下面的步骤中可以看出,下一步的后半部分是前一步的整个串,所以对于后半部分有f[n]=f[n-1]: 从前半部分和整体可以看出,另一部分有f[n]=f[n-1]-1(奇数步),f[n]=f[n-1]+1(偶数步). step0:1 f[0]=0 step1:01 f[1]=0 step2:10 01 f[2]=1 =2*f[1]+1 step3:

The Cow Lineup_找规律

Description Farmer John's N cows (1 <= N <= 100,000) are lined up in a row.Each cow is labeled with a number in the range 1...K (1 <= K <=10,000) identifying her breed. For example, a line of 14 cows might have these breeds: 1 5 3 2 5 1 3 4 4

这样用01串

今天在做东西的时候,发现了几个挺有意思的地方,记下来和大家分享分享.从几个小问题开始 记录一个年龄段你会怎么记录,能表达类似“50~70”之类的就可以? 也许你会说很简单啊,用两个字段,一个start=>开始年龄.一个end=>结束年龄,更或者在一个字段中,使用start|end这样的格式,中间用一个非数字隔开,或者用start|start-end,哈哈,反正方法很多,但是这时候如果要求升级,要你表示10~20.25.29~40这些年龄,你要怎么表示呢?当然还可以通过字符串去表示比如:10-2

【ZOJ】3785 What day is that day? ——浅谈KMP应用之ACM竞赛中的暴力打表找规律

首先声明一下,这里的规律指的是循环,即找到最小循环周期.这么一说大家心里肯定有数了吧,“不就是next数组性质的应用嘛”. 先来看一道题 ZOJ 3785 What day is that day? Time Limit: 2 Seconds      Memory Limit: 65536 KB It's Saturday today, what day is it after 11 + 22 + 33 + ... + NN days? Input There are multiple tes

hdu5351(2015多校5)--MZL&#39;s Border(打表,,找规律)

题目链接:点击打开链接 题目大意:给出b1 = 'b' , b2 = 'a' , bi = b(i-1)b(i-2),将i-1和i-2链接起来,记录一个串的s[1-i] 和s[n-i+1-n]相同的话 Border,当i为最长是为LBorder,现在给让求在bn这个串上的前m个字符组成的子串的LBorder 通过计算可以发现,b字符串的前缀都是相同的,所以只要求出m的LBorder就行,和n是无关的,打表找出规律,找出对应不同的m,LBorder的值,因为存在大数,用java写 dp[i]第i层

51nod 1391 01串(锻炼思维的好题)

题目http://www.51nod.com/onlineJudge/questionCode.html#problemId=1391?iceId=20917 1391 01串 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给定一个01串S,求出它的一个尽可能长的子串S[i..j],满足存在一个位置i<=x <=j, S[i..x]中0比1多,而S[x + 1..j]中1比0多.求满足条件的最长子串长度. Input 一行包含

HDOJ 5351 MZL&#39;s Border 找规律

打出前i个串的kmp的fail指针: p: ab 0 0 0 p: aba 0 0 0 1 p: abaab 0 0 0 1 1 2 p: abaababa 0 0 0 1 1 2 3 2 3 p: abaababaabaab 0 0 0 1 1 2 3 2 3 4 5 6 4 5 p: abaababaabaababaababa 0 0 0 1 1 2 3 2 3 4 5 6 4 5 6 7 8 9 10 11 7 8 p: abaababaabaababaababaabaababaabaab