给定一个数组A,利用A中的数字组合形成小于n的最大数,且A中的数字可以重复使用
作者:
cjn666
,
2025-04-19 22:42:56
· 江苏
,
所有人可见
,
阅读 4
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int search(vector<int> digits,int t){
int l=0,r=digits.size()-1;
while(l<r){
int mid=l+r+1>>1;
if(digits[mid]<=t)l=mid;
else r=mid-1;
}
return digits[l];
}
string maxN(vector<int> digits,int tar){
tar--;
string target=to_string(tar);
string res="";
sort(digits.begin(),digits.end());
bool less=false;
for(int i=0;i<target.size();i++){
if(less){
res+=digits.back()+'0';
continue;
}
int t=target[i]-'0';
int num=search(digits,t);
if(num<t){
res+=num+'0';
less=true;
}else if(num==t){
res+=num+'0';
}else{
int j;
for(j=i-1;j>=0;j--){
if(res[j]-'0'>digits[0]){
res[j]=search(digits,res[j]-1-'0')+'0';
for(int k=j+1;k<i;k++){
res[k]=digits.back()+'0';
}
res+=digits.back()+'0';
less=1;
break;
}
}
if(j==-1){
res="";
for(int j=0;j<target.size()-1;j++)res+=digits.back()+'0';
if(!res.size())return "-1";
return res;
}
}
}
return res;
}
int main(){
cout << maxN({6, 8}, 100) << endl;
cout << maxN({2, 4, 9}, 23121) << endl;
cout << maxN({9, 8}, 8) << endl;
cout << maxN({1, 2, 3}, 1000) << endl;
cout << maxN({8},9 ) << endl;
cout << maxN({8,6}, 100) << endl;
cout << maxN({2,3,4}, 234222) << endl;
return 0;
}