sicily 4424

16 篇文章 0 订阅
4 篇文章 0 订阅

题目链接: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;
}                                 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值