hdu6351 多校第5場 Beautiful Now
阿新 • • 發佈:2019-01-07
將當前位與後面最小值交換為最優,但可能最小值有多個,比如 2311 交換兩次 最小值為 1123 ,那麼交換哪一個呢,我們dfs遍歷一下所有最小值,然後求一個min,如果當前位是最小值,那麼就不交換,由於最多交換9次所以複雜度不高。 求最大值同理
注意首位不能為0,所以將首位單獨拿出來算一下
#pragma GCC optimize(2) #include<stdio.h> #include<string.h> #include<string> #include<math.h> #include<algorithm> #include<iostream> #include<queue> #include<vector> #include<stack> #include<map> #include<set> #include<stdlib.h> #include<time.h> #include <iomanip> #define lowbit(x) (x&(-x)) #define inf 0x7fffffff #define linf 0x7fffffffffffffff #define mem(x,y) memset(x,y,sizeof(x)) #define fup(i,x,y) for(int i=(x);i<=(y);i++) #define fdn(i,x,y) for(int i=(x);i>=(y);i--) #define sp(x) setprecision(x) #define sd(n) scanf("%d",&n) #define sdd(n,m) scanf("%d%d",&n,&m) #define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k) #define sld(n) scanf("%lld",&n) #define sldd(n,m) scanf("%lld%lld",&n,&m) #define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k) #define sf(n) scanf("%lf",&n) #define sff(n,m) scanf("%lf%lf",&n,&m) #define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k) #define sc(n) scanf("%s",n) #define pf(x) printf("%d\n",x) #define pfl(x) printf("%lld\n",x) #define pff(x) printf("%lf\n",x) #define debug printf("!!\n"); #define N 100005 #define M 4000009 #define pi acos(-1) #define eps 1e-2 //cout.setf(ios::fixed); //freopen("out.txt","w",stdout);// freopen("in.txt","r",stdin); using namespace std; typedef long long ll; typedef long long LL; int len; char ans[15]; int cnt=0; char c[15],s[15]; void dfs(int x,int sum) { if (sum==0||x>len) { if(strcmp(ans+1,s+1)>0) strcpy(ans+1,s+1); return; } int tp=x; fup(i,x,len) if(s[tp]>s[i]) tp=i; if(tp!=x) { fup(i,x+1,len) { if(s[i]==s[tp]) { // printf("%d ",i); swap(s[x],s[i]); dfs(x+1,sum-1); swap(s[x],s[i]); } } } else dfs(x+1,sum); } void dfsma(int x,int sum) { // printf("%s\n",s+1); if (sum==0||x>len) { if(strcmp(ans+1,s+1)<0) strcpy(ans+1,s+1); return; } int tp=x; fup(i,x,len) if(s[tp]<s[i]) tp=i; if(tp!=x) { fup(i,x+1,len) { if(s[i]==s[tp]) { // printf("%d ",i); swap(s[x],s[i]); dfsma(x+1,sum-1); swap(s[x],s[i]); } } } else dfsma(x+1,sum); } int main() { int t; scanf("%d",&t); while(t--) { int k; sc(c+1); sd(k); strcpy(s+1,c+1); strcpy(ans+1,c+1); len=strlen(c+1); int tp=1; if(k) { fup(i,2,len) if(s[tp]>s[i]&&s[i]!='0') tp=i; // pf(tp); if(tp!=1) { fup(i,2,len) if(s[i]==s[tp]) { swap(s[1],s[i]); dfs(2,k-1); swap(s[1],s[i]); } } else dfs(2,k); } else dfs(2,k); printf("%s ",ans+1); strcpy(ans+1,c+1); strcpy(s+1,c+1); tp=1; if(k) { fup(i,2,len) if(s[tp]<s[i]&&s[i]!='0') tp=i; // pf(tp); if(tp!=1) { fup(i,2,len) if(s[i]==s[tp]) { swap(s[1],s[i]); dfsma(2,k-1); swap(s[1],s[i]); } } else dfsma(2,k); } else dfsma(2,k); printf("%s\n",ans+1); } }