【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 }
相关文章推荐
- HDOJ 1052 Tian Ji -- The Horse Racing 贪心
- 广度优先搜索nodeHDU/HDOJ 1242 Rescue 典型的迷宫广度优先搜索题
- HDU/HDOJ 1800 Flying to the Mars 搜索
- 【贪心】【HDOJ-1050】Moving Tables
- 贪心 HDOJ 4726 Kia's Calculation
- nyoj914(二分搜索+贪心)
- HDOJ 1052 贪心
- HDOJ搜索专题之Catch That Cow
- HDOJ 题目2438 Turn the corner(三分搜索)
- HDOJ-1253 基础搜索问题总结[DFS()+BFS()]
- Hdoj 3697 Selecting courses 【贪心】
- HDOJ-1035 搜索模拟问题[深搜]
- hdoj 4882 ZCC Loves Codefires 【贪心】
- HDOJ 1428 漫步校园 (spfa+记忆搜索)
- POJ - 3258/USACO - Dec06 Silver/NOIP 2015 - 提高组 River Hopscotch 贪心+二分搜索
- HDOJ 题目4883TIANKENG’s restaurant(贪心)
- hdoj 5248 序列变换 【贪心 + 二分】
- hdu 4004 The Frog's Games (二分搜索 + 贪心)
- hdoj 3400 Line belt (三分嵌套搜索 )
- HDOJ1175连连看搜索