题意:
给定长度最大10位的串,问任意交换两个数k次 能够得到的最大最小值
思路:
首先想到的是从第一个往后面找最小/最大的 进行交换,然后会发现后面有多个 最小/最大值时 无法决定换那个最优
然后我们就可以bfs进行暴力,每次找到最小/最大的交换后加入队列,
用string存这个串,可以自动比较大小
ps: 本题解初始想直接找到最小的退出,所以用了优先队列,重载了排序,但是发现不能得到最优,所以还是跑完一遍bfs后得到最优解,可以直接用queue 实现最普通bfs
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
string s,a,b;
int k;
int len;
bool cmp(int x,int y) {
return x>y;
}
void print(int c[],int len) {
for(int i = 0; i < len; i++) {
printf("%d",c[i]);
}
}
string ans1,ans2;
struct node {
string s;
int step;
int ch;
bool operator<(const node &rhs)const {
return s>rhs.s;
}
};
struct node1 {
string s;
int step;
int ch;
bool operator<(const node1 &rhs)const {
return s<rhs.s;
}
};
int bfs1() {
priority_queue<node>Q;
Q.push((node) {
a,0,0
});
while(!Q.empty()) {
node now=Q.top();
Q.pop();
if(now.ch==k||now.step==len) {
ans1=min(ans1,now.s);
continue;
}
string temp=now.s;
if(now.step==0) {
char min_=temp[now.step];
for(int i=now.step+1; i<len; i++) {
if(temp[i]<min_&&temp[i]!='0') {
min_=temp[i];
}
}
if(temp[now.step]==min_) {
Q.push((node) {
temp,now.step+1,now.ch
});
continue;
}
for(int i=now.step; i<len; i++) {
if(temp[i]==min_) {
swap(temp[now.step],temp[i]);
Q.push((node) {
temp,now.step+1,now.ch+1
});
swap(temp[now.step],temp[i]);
}
}
} else {
char min_=temp[now.step];
for(int i=now.step+1; i<len; i++) {
if(temp[i]<min_) {
min_=temp[i];
}
}
if(temp[now.step]==min_) {
Q.push((node) {
temp,now.step+1,now.ch
});
continue;
}
for(int i=now.step; i<len; i++) {
if(temp[i]==min_) {
swap(temp[now.step],temp[i]);
Q.push((node) {
temp,now.step+1,now.ch+1
});
swap(temp[now.step],temp[i]);
}
}
}
}
}
void bfs2() {
priority_queue<node1>Q;
Q.push((node1) {
b,0,0
});
while(!Q.empty()) {
node1 now=Q.top();
Q.pop();
if(now.ch==k||now.step==len) {
ans2=max(ans2,now.s);
continue;
}
string temp=now.s;
char min_=temp[now.step];
for(int i=now.step+1; i<len; i++) {
if(temp[i]>min_) {
min_=temp[i];
}
}
if(temp[now.step]==min_) {
Q.push((node1) {
temp,now.step+1,now.ch
});
continue;
}
for(int i=now.step; i<len; i++) {
if(temp[i]==min_) {
swap(temp[now.step],temp[i]);
Q.push((node1) {
temp,now.step+1,now.ch+1
});
swap(temp[now.step],temp[i]);
}
}
}
}
int main() {
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--) {
cin>>s>>k;
len=s.length();
k=min(k,len);
a=s;
b=s;
ans1=s;
ans2=s;
bfs1();
bfs2();
cout<<ans1<<" "<<ans2<<endl;
}
return 0;
}