辞树的最大数(搜索)

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

猜你喜欢

转载自blog.csdn.net/liuliu2333/article/details/81741020