您的位置:首页 > 其它

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

2018-08-07 14:49 225 查看

题意:给定一个数字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 }

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: