zoukankan      html  css  js  c++  java
  • 【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,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
    ",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,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("
    ");
    184             continue;
    185         }
    186              
    187         mn=mx=n;
    188        
    189         dfs1(n,0,1);
    190         dfs2(n,0,1);
    191         printf("%d %d
    ",mn,mx);
    192     }
    193     return 0;
    194 }
  • 相关阅读:
    jquery mobile pages之间的跳转
    Javascript中this、prototype、constructor的理解
    javaScript的引号使用
    javaScript的事件
    我的css
    HTML5 canvas的事件
    java动态代理
    (转)面向对象的 JavaScript 编程:dojo.declare 详解
    Speex手册编解码介绍 中文翻译
    Android修改自己程序字体
  • 原文地址:https://www.cnblogs.com/myx12345/p/9436953.html
Copyright © 2011-2022 走看看