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;
}