Beautiful Now Gym - 102114B (dfs 暴力)

链接 Beautiful Now

题意 :
给一个数字,每次可以交换任意两位,最多交换 k 次,问最后可以得到的最大和最小数是多少。
思路

  1. 一开始想的是贪心,把原数字排序,然后以为以为比较,如果不同 就从后往前找到那个可以交换的位置,然后交换他们。
  2. wa 了好多遍后发现不行,例如 3422 按照以上思路 ,交换两次 依次得到 3422->2423->2243,两次的时候是不满足的,不好确定有相同数是先换哪一个。
  3. 然后想用全排列,发现不会算 一个数最少交换几次可以得到目标数。(这个解法下回补)。
  4. 最后就是暴力交换了,dfs 枚举每种可能的交换,然后去最大最小。

代码

#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn=1e6+7;
int t,k,cnt[10],vis[10],len;
string s,ans1,ans2;
void dfs1(int pos,int step){
     if(pos>=len||step>k||s[0]=='0') return ;
     ans1=min(ans1,s);
     ans2=max(ans2,s);
     for(int i=pos;i<len;i++){
         swap(s[pos],s[i]);
         if(pos==i) dfs1(pos+1,step);
         else dfs1(pos+1,step+1);
         swap(s[pos],s[i]);
     }
}
int main(){
    cin>>t;
    while(t--){
        cin>>s>>k;
        len=s.size();
        ans1=s,ans2=s;
        dfs1(0,0);
        cout<<ans1<<" "<<ans2<<endl;
    }
}


你可能感兴趣的:(Beautiful Now Gym - 102114B (dfs 暴力))