【HDOJ6351】Beautiful Now(贪心,搜索)

题意:给定一个数字n,最多可以交换其两个数位k次,求交换后的最大值与最小值,最小值不能有前导0

n,k<=1e9

思路:

当k>=n的位数时只需要无脑排序

k<n时有一个显然的贪心是从高位到低位,如果当前位置不是可取的最值的话就从比现在低的位置挑一个最值换上来

问题在于可能有多个低位上的数字相同,而且这个问题没有正确的贪心策略

所以只能记录下它们的位置,依次搜索

搜索最小值时第一位不能是0

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<string>
  4 #include<cmath>
  5 #include<iostream>
  6 #include<algorithm>
  7 #include<map>
  8 #include<set>
  9 #include<queue>
 10 #include<vector>
 11 using namespace std;
 12 typedef long long ll;
 13 typedef unsigned int uint;
 14 typedef unsigned long long ull;
 15 typedef pair<int,int> PII;
 16 typedef vector<int> VI;
 17 #define fi first
 18 #define se second 
 19 #define MP make_pair
 20 #define N   11000000
 21 #define MOD 1000000007
 22 #define eps 1e-8 
 23 #define pi acos(-1)
 24 
 25 ll f[10],mx,mn;
 26 int a[10],b[10],K,len;
 27 
 28 void dfs1(ll n,int s,int k)
 29 {
 30 //printf("%lld %d %d\n",n,s,k); 
 31     mn=min(mn,n);
 32     mx=max(mx,n);
 33     if(s==len) return;
 34     if(k==K+1) return;
 35     int flag=1;
 36     for(int i=s+2;i<=len;i++)
 37      if(b[i]<b[s+1]) {flag=0;break;}
 38     if(flag)
 39     {
 40         dfs1(n,s+1,k);
 41         return;
 42     }
 43     int c[9];
 44     int now=b[s+1];
 45     int m=0;
 46     for(int i=s+2;i<=len;i++)
 47     { 
 48          if(b[i]<now)
 49          {
 50              m=1;
 51              c[1]=i;
 52              now=b[i];
 53              continue;
 54         }
 55         if(b[i]==now) c[++m]=i;
 56     }
 57     //printf("%d %d\n",m,c[m]); 
 58     if(k==1&&s==0&&m>0&&b[c[m]]==0)
 59     {
 60         m=0; now=b[1];
 61         for(int i=2;i<=len;i++)
 62         {
 63             if(b[i]==0) continue;
 64             if(b[i]<now)
 65              {
 66                  m=1;
 67                  c[1]=i;
 68                  now=b[i];
 69                  continue;
 70             }
 71             if(b[i]==now) c[++m]=i;
 72         }
 73     }
 74     for(int i=1;i<=m;i++)
 75     {
 76         int t=c[i];
 77         ll tmp=n+f[len-s-1]*(b[t]-b[s+1])+f[len-t]*(b[s+1]-b[t]);
 78         swap(b[s+1],b[t]);
 79         dfs1(tmp,s+1,k+1); 
 80         swap(b[s+1],b[t]);
 81     }
 82     dfs1(n,s+1,k);
 83 }
 84         
 85 void dfs2(ll n,int s,int k)
 86 {
 87     //printf("%lld %d %d\n",n,s,k); 
 88     mn=min(mn,n);
 89     mx=max(mx,n);
 90     if(s==len) return;
 91     if(k==K+1) return;
 92     int flag=1;
 93     for(int i=s+2;i<=len;i++)
 94      if(b[i]>b[s+1]) {flag=0;break;}
 95     if(flag)
 96     {
 97         dfs2(n,s+1,k);
 98         return;
 99     }
100     int c[9];
101     int now=b[s+1];
102     int m=0;
103     for(int i=s+2;i<=len;i++)
104     { 
105          if(b[i]>now)
106          {
107              m=1;
108              c[1]=i;
109              now=b[i];
110              continue;
111         }
112         if(b[i]==now) c[++m]=i;
113     }
114     for(int i=1;i<=m;i++)
115     {
116         int t=c[i];
117         ll tmp=n+f[len-s-1]*(b[t]-b[s+1])+f[len-t]*(b[s+1]-b[t]);
118         swap(b[s+1],b[t]);
119         dfs2(tmp,s+1,k+1); 
120         swap(b[s+1],b[t]);
121     }
122     dfs2(n,s+1,k); 
123 }
124                 
125     
126 int read()
127 { 
128    int v=0,f=1;
129    char c=getchar();
130    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
131    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
132    return v*f;
133 }
134 
135 void swap(int &x,int &y)
136 {
137     int t=x;x=y;y=t;
138 }
139 
140 int main()
141 {
142     freopen("1.in","r",stdin);
143     freopen("1.out","w",stdout);
144     f[0]=1;
145     for(int i=1;i<=9;i++) f[i]=f[i-1]*10;
146     int cas;
147     scanf("%d",&cas);
148     while(cas--)
149     {
150         int n;
151         scanf("%d%d",&n,&K);
152         len=0;
153         int t=n;
154         while(t)
155         {
156             b[++len]=t%10;
157             t/=10;
158         }
159         for(int i=1;i<=len/2;i++) swap(b[i],b[len-i+1]);
160         if(K>=len)
161         {
162             for(int i=0;i<=9;i++) a[i]=0;
163             int t=n;
164             while(t)
165             {
166                 a[t%10]++;
167                 t/=10;
168             }
169             for(int i=1;i<=9;i++)
170              if(a[i]){a[i]--; printf("%d",i); break;}
171             for(int i=0;i<=9;i++)
172              for(int j=1;j<=a[i];j++) printf("%d",i);
173             printf(" ");
174             for(int i=0;i<=9;i++) a[i]=0;
175             t=n;
176             while(t)
177             {
178                 a[t%10]++;
179                 t/=10;
180             }
181             for(int i=9;i>=0;i--)
182              for(int j=1;j<=a[i];j++) printf("%d",i);
183             printf("\n");
184             continue;
185         }
186              
187         mn=mx=n;
188        
189         dfs1(n,0,1);
190         dfs2(n,0,1);
191         printf("%d %d\n",mn,mx);
192     }
193     return 0;
194 }

 

posted on 2018-08-07 14:49  myx12345  阅读(251)  评论(0编辑  收藏  举报

导航