CF1808C 题解

可以考虑从小到大枚举差值$i$,再枚举最小数字$j$,这样当前的最大数字就是$i+j$,然后进行搜索,看在满足当前状态下是否能找到一个合法的数字,实际上就是在进行数位DP。

搜索中一些变量的解释:pos表示当前位,mx最大数字,mi最小数字,p前面枚举的数字是否在下界,q上界,now已经枚举的数字,limit前导$0$标志。

 

#include<bits/stdc++.h>
#define int long long
using namespace std;
bool flag=0;
int T,l,r,a[20],b[20];
void dfs(int pos,int mx,int mi,int p,int q,int now,int limit)
{
    if (flag==1) return;
    if (pos==0)
    {
        flag=1;
        cout<<now<<endl;
        return;
    }
    int st=0,ed=9;
    if (p) st=a[pos];
    if (q) ed=b[pos];
    for (int i=st;i<=ed;i++)
    {
        if ((mi<=i&&i<=mx)||(limit&&(i==0)))
            dfs(pos-1,mx,mi,p&&(i==a[pos]),q&&(i==b[pos]),now*10+i,limit&&(i==0));
        if (flag==1) break;
    }
}
signed main()
{
    cin>>T;
    while(T--)
    {
        cin>>l>>r;
        for (int i=1;i<=19;i++)
        {
            a[i]=l%10;l/=10;
            b[i]=r%10;r/=10;
        }
        flag=0;
        for (int i=0;i<=9;i++)//mx-mi
            for (int j=0;j+i<=9;j++)//mi
                dfs(19,j+i,j,1,1,0,1);
    }
    return 0;
}

 

posted @ 2023-04-04 00:57  我亦如此向往  阅读(44)  评论(1编辑  收藏  举报