题意
寻找一个最小的 大于n的super lucky数字,super lucky数字时只含4和7。
思路
最初想着拼凑,找规律,没办法只有DFS了,
INF设的太小wa,ans会超int
ans的临时变量tem忘开long long又wa
AC Code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e13+5;
ll minl(int n) {
int len = n/2,len2 = n/2;
ll ans = 0;
while(len--) {
ans*=10;
ans+=4;
}
while(len2--) {
ans*=10;
ans+=7;
}
return ans;
}
ll maxl(int n) {
int len = n/2, len2 = n/2;
ll ans = 0;
while(len--) {
ans*=10;
ans+=7;
}
while(len2--) {
ans*=10;
ans+=4;
}
return ans;
}
ll cnt,ans,n;
bool check(ll n) {
int d[15],cnt = 0;
while(n) {
d[cnt++] = n%10;
n/=10;
if(d[cnt-1] != 4 && d[cnt-1] != 7) return 0;
}
int x=0,y=0;
for(int i = 0; i<cnt; i++) {
if(d[i] == 4) x++;
else if(d[i] == 7) y++;
}
if(x == y) {
return 1;
}
return 0;
}
void dfs(int step,ll sum) {
if(step == cnt && sum >= n && check(sum)) {
ans = min(sum,ans);
}
if(step == cnt) return ;
sum *=10;
step++;
ll tem=sum+4,tem1=sum+7;
dfs(step,tem);
dfs(step,tem1);
}
int main() {
ans = INF;
cin>>n;
cnt = 0;
int d[15],dd = 1;
int tem = n;
while(tem) {
cnt++;
d[dd++] = tem%10;
tem/=10;
}
if(cnt%2 || n>maxl(cnt)) cout<<minl(cnt+2)<<endl;
else {
//if(cnt>=10) cout<<"4444477777"<<endl;
//else {
dfs(0,0);
cout<<ans<<endl;
// }
}
return 0;
}
正宗递归
#include<iostream>
using namespace std;
long long n, ans = 1LL << 60;
void F(long long x, int y, int z) {//通过x构造答案,y是4的个数,z是7点个数
if(x >= n && y == z) ans=min(ans, x);//答案ans满足要求:1.大于等于n 2.只存在7和4,且7的个数等于4的个数
if(x > n * 100) return;//答案肯定在n和n*100之间,所以x>n*100的时候退出;
F(x * 10 + 4, y + 1, z);//当前答案x加一位数4
F(x * 10 + 7, y, z + 1);//当前答案x加一位数7
}
int main() {
cin >> n;
F(0, 0, 0);
cout << ans;
return 0;}