Lucky Numbers (easy) CodeForces - 96B (DFS)

Petya喜欢幸运数字。 大家都知道,正数整数是幸运的,如果它们的十进制表示不包含4和7以外的数字。例如,数字47,744,4是幸运的,5,17,46,7不是。 幸运数字超级幸运,如果它的十进制表示包含相等数量的数字4和7.例如,数字47,7744,474477是超级幸运,4,744,467不是。 有一天,Petya遇到了一个正整数n。 帮助他找出大于等于给定的数字的最小的超级幸运数字.

Input

输入一个正整数n(n<1e9)。

Output

输出大于等于给定的数字的最小的超级幸运数字.n.

Please, do not use the %lld specificator to read or write 64-bit integers in C++. It is preferred to use the cin, cout streams or the %I64d specificator.

Example

Input

4500

Output

4747

Input

47

Output

47

一开始不知道这个题目 怎么写,想着要不要暴力?肯定是会超时的,后来看到大神博客使用 dfs 来构造出一个数据,使得4和7的位数是一样的,然后dfs构造数据,dfs 暴力去搜索,加上一个位数7 就是数据乘10+7 ,加上一个位数 4就是数据乘10+4 。然后判断每一次是否符合 条件,我们每次在加上一个 7或者一个4 的时候,都会记录此时 7 和 4的数量,到后面以便我们判断现在行不行,我们还需要加上一个 结束条件,一般99 会找到4477,这个是需要构造位数最多的 一个了,因为4 和7的位数一样,我们需要这个 位数是个偶数,所以再加两位数是最多的需要加的位数, 就是回溯条件是 大于这个原始数据的 100倍时 ,就要回溯了。代码 :


#include<iostream>
using namespace std;
#include<bits/stdc++.h>
const int maxn=1005;
typedef long long ll;

ll n;
ll ans=1LL << 60;
bool flag;


void dfs(ll sum,ll shu7,ll shu4)
{
	
		
	if(sum>=n&&shu7==shu4)
	{
		ans=min(ans,sum);
	}
	
	
	if(sum > n * 100) 
		return;
	
	dfs(sum*10+4,shu7,shu4+1);	
	dfs(sum*10+7,shu7+1,shu4);
	
	
	
	return ;
}


int main()
{
	cout<<ans<<endl;
	cin>>n;
	
	dfs(0,0,0);
	cout<<ans<<endl;
	
	return 0;
}
发布了123 篇原创文章 · 获赞 83 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/tsam123/article/details/89032759