T24重新排列TI40

24. 重新排列

题目ID:20009拓展题100分

最新提交:

Time Limit Exceeded

40 分

历史最高:

Time Limit Exceeded

40 分

时间限制: 1000ms

空间限制: 65536kB

题目描述

给出两个正整数a,b。在十进制下重排a,构造一个不超过b的最大数,不能有前导零。允许不去重排a。

输入格式

第一行一个数a (1≤a≤10181≤a≤1018)。第二行一个数b (1≤b≤10181≤b≤1018)

数没有前导零,数据保证有解。

输出格式

输出一个数,表示a重排后不超过b的最大数,不应该有前导零。

输出的数的长度应该与a相等,它应该是a的一个排列。

样例

Input 1

123 222

Output 1

213

Input 2

3921 10000

Output 2

9321

Input 3

4940 5000

Output 3

4940

#include<bits/stdc++.h>
using namespace std;
bool b[21];
bool cmp(char x,char y){
	return x>y;
}
bool cheak(string x,string y){
	if(x.size()==y.size()){
		for(int i=0;i<x.size();i++){
			if(x[i]!=y[i]){
				return x[i]>y[i];
			}
		}
		return true;
	}
	return x.size()>y.size(); 
}
string x,y,cnt,ans;
void dfs(int num,bool bb){
	if(num==x.size()+1){
		if(cheak(y,ans)&&cheak(ans,cnt)){
			cnt=ans;
		}
		return;
	}
	for(int i=0;i<x.size();i++){
		if((x[i]<=y[num-1]||bb)&&b[i]==0){
			b[i]=1;
			ans.push_back(x[i]);
			dfs(num+1,bb||x[i]<y[num-1]);
			ans.pop_back();
			b[i]=0;
			if(x[i]<y[num-1])break;
		}
	}
}
int main(){
	cin>>x>>y; 
	sort(x.begin(),x.end(),cmp);
	if(y.size()>x.size()){
		cout<<x;
		return 0;
	}
	dfs(1,0);
	cout<<cnt;
	return 0;
} 

复制到c++就好了,我不知道咋格式化

1 个赞

image

1 个赞