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; }