给定一个正整数 n,请你找到一个正整数 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;
- }