HDU - 6351 Beautiful Now 思路+bfs

题意:

给定长度最大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;
}

猜你喜欢

转载自blog.csdn.net/xiang_6/article/details/81503252