sicily 4424

来源:互联网 发布:淘宝喵喵折 编辑:程序博客网 时间:2024/06/06 02:45

题目链接: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;}                                 
0 0
原创粉丝点击