#特殊判断#牛客练习赛71 A 回文数

题目


分析

首先出现奇数次的数超过1显然无解
并且只有多个0或者只有一个非0数字并且其它都是0也无解
然后由于没有前导0所以先要找到最小的非0数,先占据首尾
最后按照常规方法前一半从左到右依次递增
注意如果只有一个非0数字并且出现奇数次以及其它都是0不一定无解,
成功因此罚了两次时


代码

#include <cstdio>
#define rr register
using namespace std;
int c[10],rt=-1,f,cnt;
inline void doit(){
    for (rr int i=0;i<10;++i)
    for (rr int j=c[i];j>1;j-=2)
        putchar(i+48),--c[i];
    if (~rt) putchar(rt+48),--c[rt];
    for (rr int i=9;~i;--i)
    for (;c[i];--c[i]) putchar(i+48);
}
signed main(){
    for (rr int i=0;i<10;++i)
        scanf("%d",&c[i]),cnt+=c[i];
    for (rr int i=0;i<10;++i)
    if (c[i]&1){
        if (~rt) return !printf("-1");
            else rt=i;
    }
    if (c[0]){
        for (rr int i=1;i<10;++i) if (c[i]){f=i; break;}
        if (cnt-c[0]==1||(cnt==c[0]&&c[0]>1)) return !printf("-1");
        if (!f) return !printf("0");
        putchar(f+48),c[f]-=2,doit(),putchar(f+48);
    }else doit();
    return 0;
}
posted @ 2020-10-10 09:00  lemondinosaur  阅读(98)  评论(0编辑  收藏  举报