题目链接:sicily 4424
解题思路:
先找到符合lucky number位数要求最小的数,然后枚举所有可能性,最小的符合要求的数即为答案。枚举方法使用全排列的next_permutation算法思想,生成全排列中下一个数。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n, len,num[15];
int calc(int n)
{
int len=0;
while(n){
n/=10;
n/=10;
len++;
}
return len;
}
pair<long long,long long> sum()
{
long long res1=0,res2=0;
for(int i=0;i<len;i++)
res1 = res1*10 + num[i];
for(int i=len-1;i>=0;i--)
res2 = res2*10 + num[i];
return make_pair(res1,res2);
}
void next()
{
int i,j,k=0;
for(i=len-2;i>=0;i--)
if(num[i]<num[i+1])
{
k=1;
break;
}
if(!k)
return;
for(j=len-1;j>i;j--)
if(num[i]<num[j])
break;
swap(num[i],num[j]);
for(k=i+1;k<=(i+len)/2;k++)
swap(num[k], num[i+len-k]);
}
long long solve()
{
pair<long long,long long> res=sum();
long long res1=res.first, res2=res.second;
while(res1<n)
{
if(res1==res2)
break;
next();
res1 = sum().first;
}
if(res1<n){
len=len/2+1;
for(int i=0;i<len;i++)
num[i]=4, num[i+len]=7;
len*=2;
res1=sum().first;
}
return res1;
}
int main()
{
int T;
scanf("%d",&T);
while(~scanf("%d",&n))
{
len=calc(n);
for(int i=0;i<len;i++)
num[i]=4, num[i+len]=7;
len*=2;
printf("%lld\n",solve());
}
return 0;
}