Description
给出两个整数a和b,对于数字a可以无限次更换两个数位上的数字以构造不超过b的最大数。
Input
输入:
第一行输入一个整数 T(0<T<11),代表有T组数据。
每行输入两个整数 a,b (0<a,b < 1e18)
Output
输出:
打印最大可能的数字,该数字是a的数字排列并且不大于b。
每组数据输出后换行
Sample Input 1
3 123 222 3921 10000 4940 5000
Sample Output 1
213 9321 4940
以后写数据小的题的时候,要尝试尝试爆搜,原本思路有BUG,1230 1200 输不出来..
#include<bits/stdc++.h>
using namespace std;
int cmp(int x,int y)
{
return x>y;
}
long long ok=-1;
long long a,b;
int w[22],ww[22];
int k=0;
int e=0;
int vis[22];
void dfs(int ee,long long s,long long ss)
{
if(ee==e)
{
if(s<=b)
{
ok=max(ok,s);
return;
}
}
if(s>ss)
{
return;
}
for(int i=0;i<k;i++)
{
if(vis[i]==0)
{
vis[i]=1;
dfs(ee+1,s*10+w[i],ss*10+ww[k-1-ee]);
vis[i]=0;
if(ok!=-1)
return;
}
if(ok!=-1)
return;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ok=-1;k=0;e=0;
scanf("%lld %lld",&a,&b);
memset(vis,0,sizeof(vis));
while(a>0)
{
w[k++]=a%10;a=a/10;
}
long long bb=b;
while(bb>0){
ww[e]=bb%10;e++;bb=bb/10;
}
sort(w,w+k,cmp);
if(e>k)
{
for(int i=0;i<k;i++)
{
printf("%d",w[i]);
}
printf("\n");
continue;
}
dfs(0,0,0);
if(ok!=-1)
{
printf("%lld\n",ok);
}
}
}