给定一个正整数 n,请你找到一个正整数 x,要求:
- x≥n
- x 的各个数位均不包含 4 和 7 以外的数字,且 x 中包含的 4 的数量与 7 的数量恰好相等。
- 满足前两个条件的前提下,x 应尽可能小。
输入格式
一个正整数 n。
输出格式
一个正整数,表示 x。
数据范围
前 66 个测试点满足1≤n≤5000。
所有测试点满足 1≤n≤10^9。
输入样例1:
4500
输出样例1:
4747
输入样例2:
47
输出样例2:
47
分析:最多有十位数,所以直接暴搜。暴搜是搜索所有的可能结果。
但自己写时候,由于dfs不够熟练,没写出来
思路:定义一个字符串·ans作为答案,str作为中间变量,
再定义一个u作为记录枚举当前的数位,s4作为4出现的次数,s7作为7出现的次数。
如果当前 str 的 u 枚举到num的大小,开始判断,如果str>=num && (ans.empty()||ans>str)
更新当前的ans。
#include<iostream>
#include<string>
using namespace std;
string num;
string ans;
void dfs(string str,int u,int s4,int s7)
{
if(u==num.size())
{
if(str >= num && s4==s7 && (ans.empty() || ans > str ))
ans = str;
return ;
}
if(s4 < num.size() / 2) dfs(str + '4',u + 1, s4 + 1,s7);//因为这里的判断条件,所以
//return那里不需要判断是否s4==s7
if(s7 < num.size() / 2) dfs(str + '7',u + 1, s4, s7 + 1);
}
int main()
{
cin>>num;
if(num.size()%2) num = '0' + num;
dfs("",0,0,0);
if(ans.empty())
{
//cout<<ans.empty()<<endl;if字符串为空,return 1
num = "00" + num;
dfs("",0,0,0);
}
cout<<ans<<endl;
return 0;
}