zoukankan      html  css  js  c++  java
  • hdu6351 Beautiful Now 杭电第五场 暴力枚举

    Beautiful Now

    Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
    Total Submission(s): 0    Accepted Submission(s): 0


    Problem Description
    Anton has a positive integer n, however, it quite looks like a mess, so he wants to make it beautiful after k swaps of digits.
    Let the decimal representation of n as (x1x2xm)10 satisfying that 1x190xi9 (2im), which means n=mi=1xi10mi. In each swap, Anton can select two digits xi and xj (1ijm) and then swap them if the integer after this swap has no leading zero.
    Could you please tell him the minimum integer and the maximum integer he can obtain after k swaps?
     
    Input
    The first line contains one integer T, indicating the number of test cases.
    Each of the following T lines describes a test case and contains two space-separated integers n and k.
    1T1001n,k109.
     
    Output
    For each test case, print in one line the minimum integer and the maximum integer which are separated by one space.
     
    Sample Input
    5 12 1 213 2 998244353 1 998244353 2 998244353 3
     
    Sample Output
    12 21 123 321 298944353 998544323 238944359 998544332 233944859 998544332
    枚举每种交换情况,分别取最大和去最小,记得特判前导零
    AC代码:
    #include <map>
    #include <set>
    #include <stack>
    #include <cmath>
    #include <queue>
    #include <cstdio>
    #include <vector>
    #include <string>
    #include <bitset>
    #include <cstring>
    #include <iomanip>
    #include <iostream>
    #include <algorithm>
    #define ls (r<<1)
    #define rs (r<<1|1)
    #define debug(a) cout << #a << " " << a << endl
    using namespace std;
    typedef long long ll;
    const ll maxn = 1e2+10;
    const ll mod = 998244353;
    const double pi = acos(-1.0);
    ll n, m;
    bool cmp( char p, char q ) {
        return p > q;
    }
    string strmin, strmax, s, tmin, tmax;
    void dfs1( ll x, ll cnt, string t ) {
        if( cnt > n-1 || x == t.length()-1 ) {
            //debug(cnt), debug(tmin), debug(strmin), debug(t);
            strmin = min(strmin,t);
            return ;
        }
        if( t[x] == tmin[x] ) {
            dfs1(x+1,cnt,t);
            return ;
        }
        char c = 'a';
        for( ll i = x+1; i < t.length(); i ++ ) {
            if( t[i] <= c ) {
                if( x == 0 && t[i] == '0' ) {
                    continue;
                }
                c = t[i];
            }
        }
        if( c == 'a' ) {
            dfs1(x+1,cnt,t);
            return ;
        }
        for( ll i = x+1; i < t.length(); i ++ ) {
            if( t[i] == c ) {
                swap(t[i],t[x]);
                dfs1(x+1,cnt+1,t);
                swap(t[i],t[x]);
            }
        }
    }
    void dfs2( ll x, ll cnt, string t ) {
        if( cnt > n-1 || x == t.length()-1 ) {
            //debug(cnt), debug(tmax), debug(strmax), debug(t);
            strmax = max(strmax,t);
            return ;
        }
        if( t[x] == tmax[x] ) {
            dfs2(x+1,cnt,t);
            return ;
        }
        char c = '0';
        bool flag = true;
        for( ll i = x+1; i < t.length(); i ++ ) {
            if( t[i] >= c ) {
                c = t[i];
                flag = false;
            }
        }
        for( ll i = x+1; i < t.length(); i ++ ) {
            if( t[i] == c ) {
                swap(t[i],t[x]);
                dfs2(x+1,cnt+1,t);
                swap(t[i],t[x]);
            }
        }
    }
    string rev( string s ) {
        string t = "";
        for( ll i = 0, j = s.length()-1; i < s.length(); i ++, j -- ) {
            t = t + s[j];
        }
        return t;
    }
    int main() {
        ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    	ll T, t = 1;
    	cin >> T;
    	while( T -- ) {
            s = "";
            ll j = 0;
            cin >> m >> n;
            while(m) {
                char c = (m%10)+'0';
                s = s + c;
                m /= 10;
            }
            s = rev(s);
            tmin = s, tmax = s;
            sort(tmin.begin(),tmin.end());
            sort(tmax.begin(),tmax.end(),cmp);
            if( tmin[0] == '0' ) {
                char c = 'a';
                ll inx = -1;
                for( ll i = 1; i < tmin.length(); i ++ ) {
                    if( tmin[i] != '0' && tmin[i] < c ) {
                        c = tmin[i];
                        inx = i;
                    }
                }
                if( inx != -1 ) {
                    swap(tmin[inx],tmin[0]);
                }
            }
            if( n >= s.length()-1 ) {
                cout << tmin << " " << tmax << endl;
            } else {
                strmin = s;
                dfs1(0,0,strmin);
                strmax = s;
                dfs2(0,0,strmax);
                cout << strmin << " " << strmax << endl;
            }
    	}
    	return 0;
    }
    /*
    123112 2
    111322 322111
    10001 2
    */
    

      

    彼时当年少,莫负好时光。
  • 相关阅读:
    深圳市共创力为某上市公司提供的整机工程研发管理咨询项目顺利结项!
    2017.9.16~17,热烈庆祝共创力罗老师《敏捷MINI体验式实战培训》在某大型企业成功举办!
    2017年8月20日,杨学明老师为深圳某著名医疗企业提供内训课程服务!
    2017年8月18日~19日,杨学明老师为深圳某著名汽车电子企业提供内训课程服务!
    Python使用Plotly绘图工具,绘制饼图
    Python安装第三方包(模块/工具)出现链接超时,网速慢,安装不上的问题如何解决
    Python使用Plotly绘图工具,绘制甘特图
    Python使用Plotly绘图工具,绘制水平条形图
    Python使用Plotly绘图工具,绘制柱状图
    Python使用Plotly绘图工具,绘制气泡图
  • 原文地址:https://www.cnblogs.com/l609929321/p/9431111.html
Copyright © 2011-2022 走看看