Lucky number is super lucky if it’s decimal representation contains equal amount of digits 4 and 7. For example, numbers 47, 7744, 474477 are super lucky and 4, 744, 467 are not.
find the least super lucky number which is not less than n.
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <vector>
using namespace std;
const int N=110007,INF=0x3f3f3f3f;
typedef long long ll;
ll MAX=1e11;
vector<ll> q;
void dfs(ll sum,int x,int y)
{
if(sum>MAX) return;
if(x==y) q.push_back(sum);
dfs(sum*10+4LL,x+1,y);
dfs(sum*10+7LL,x,y+1);
}
int main()
{
dfs(4,1,0);
dfs(7,0,1);
sort(q.begin(),q.end());
int n;
scanf("%d",&n);
ll it=(ll)*lower_bound(q.begin(),q.end(),n);
printf("%lld\n",it);
}
next_permutation 暴力
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=100,INF=0x3f3f3f3f;
char a[6][17]={"47","4477","444777","44447777","4444477777","444444777777"};
vector<ll> q;
int main()
{
ll sum;
int k=2;
for(int i=0;i<6;i++)
{
do
{
sum=0;
for(int j=0;j<k;j++)
sum*=10,sum+=a[i][j]-'0';
q.push_back(sum);
}while(next_permutation(a[i],a[i]+k));
k+=2;
}
ll n;
scanf("%lld",&n);
ll it=(ll)(*lower_bound(q.begin(),q.end(),n));//注意范围是ll
printf("%lld\n",it);
}