• 牛客练习赛71——回文数(模拟+细节)


    牛客练习赛71——回文数(模拟+细节)

    真的细节。

    原题链接

    思路:

    记每一位的个数为num[i].根据题意可以得知:

    无法构造的情况有:

    1.有至少两个num[i]为奇数。

    2.num[0]>=2并且其他数位只有一个并且只出现了一次,比如050,就无法避免前导0

    注意特判最后一个样例。

    正常做法分为两类,如果num[0]==0,说明无需考虑前导零的问题,直接从小到大枚举取一半构造出前半段,翻转得到后半段即可;否则,就要先把最小的非0位放在开始,然后再重复前面的步骤。如果num[i]%2的话,就将多出来的这个放在中间。

    附上垃圾代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<ll,ll>PLL;
    typedef pair<int,int>PII;
    typedef pair<double,double>PDD;
    #define I_int ll
    inline ll read()
    {
        ll x=0,f=1;
        char ch=getchar();
        while(ch<'0'||ch>'9')
        {
            if(ch=='-')
                f=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')
        {
            x=x*10+ch-'0';
            ch=getchar();
        }
        return x*f;
    }
    char F[200];
    inline void out(I_int x)
    {
        if (x == 0)
            return (void) (putchar('0'));
        I_int tmp = x > 0 ? x : -x;
        if (x < 0)
            putchar('-');
        int cnt = 0;
        while (tmp > 0)
        {
            F[cnt++] = tmp % 10 + '0';
            tmp /= 10;
        }
        while (cnt > 0)
            putchar(F[--cnt]);
        //cout<<" ";
    }
    ll ksm(ll a,ll b,ll p)
    {
        ll res=1;
        while(b)
        {
            if(b&1)
                res=res*a%p;
            a=a*a%p;
            b>>=1;
        }
        return res;
    }
    const ll inf = 0x3f3f3f3f3f3f3f3f;
    const int N=410,mod=1e8;
    const double PI = 3.1415926535;
    const double eps=1e-6;
    const int maxn=1100;
    
    int main()
    {
        int num[10];
        int cnt=0,sum=0,pos;
        for(int i=0; i<=9; i++)
        {
            num[i]=read();
            if(num[i]&1)
                cnt++,pos=i;
            if(num[i]) sum++;
        }
        if(cnt>1||(num[0]>=2&&sum==2&&num[pos]==1))
            puts("-1");
        else if(sum==1&&num[0]==1) puts("0");
        else
        {
            if(num[0]==0)
            {
                string s;
                int flag=-1;
                for(int i=0; i<=9; i++)
                    if(num[i])
                    {
                        for(int j=1; j<=num[i]/2; j++)
                        {
                            char t=i+'0';
                            s=s+t;
                        }
                        if(num[i]&1)
                            flag=i;
                    }
                cout<<s;
                if(flag!=-1)
                    cout<<flag;
                reverse(s.begin(),s.end());
                cout<<s<<endl;
            }
            else
            {
                string s;
                int pos=1;
                while(!num[pos]) pos++;
                char ch=pos+'0';
                s+=ch;
                num[pos]-=2;
                int flag=-1;
                for(int i=0; i<=9; i++)
                    if(num[i])
                    {
                        for(int j=1; j<=num[i]/2; j++)
                        {
                            char t=i+'0';
                            s=s+t;
                        }
                        if(num[i]&1)
                            flag=i;
                    }
                cout<<s;
                if(flag!=-1)
                    cout<<flag;
                reverse(s.begin(),s.end());
                cout<<s<<endl;
            }
        }
        return 0;
    }
    
    
    
  • 相关阅读:
    strcpy_s 和 strcat_s的用法 简单
    SAP更改商品的授权
    SAP设置默认的登录Client Code
    SAP安装windwos XP Sap的show 教程什么都看不到,的解决办法
    SAP用户管理
    sap 常用事务代码
    SAP-系统表
    随笔
    SAP如何学好SAP BASIS
    SAP IMG
  • 原文地址:https://www.cnblogs.com/OvOq/p/14853054.html
Copyright © 2020-2023  润新知