zoukankan      html  css  js  c++  java
  • 牛客练习赛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;
    }
    
    
    
  • 相关阅读:
    Windows各系统关闭更新(winXP/win2003/win7/win8/win2012/win10)
    SSH框架搭建与整合
    Servlet转发和重定向response.sendRedirecte()区别 (转)
    el 表达式用法(转)
    数组和集合(collection)调用syso输出时,结果不一致问题
    Java 接口和抽象类可以被new么?
    Dbutils
    dbutils使用---QueryRunner(query_update)、BeanListBeanHandler、MapListMapHandler、ScalarHandler
    Hadoop参数:fs.defaultFS、 dfs.name.dir 、 dfs.data.dir
    工厂设计模式(三种)详解
  • 原文地址:https://www.cnblogs.com/OvOq/p/14853054.html
Copyright © 2011-2022 走看看