A回文数题解

回文数

https://ac.nowcoder.com/acm/contest/7745/A

这题实在太细节,前后WA了十几次
当有两个奇数或0的个数大于等于非0个数 输出-1
重要的是特判最后一个样例
后面就先处理回文串的前一半,再处理回文串的后一半
在代码中已经写了详细的注释
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int su=0,a[10],nu=0,s;
    for(int i=0; i<10; ++i)
    {
        scanf("%d",&a[i]),su+=a[i];
        if(a[i]%2)
            nu++,s=i;
    }
    char ans[1000]={'\0'};
    int cn=0;
    if(a[0]==1&&su-a[0]==0)//特判最后一个样例
    {
        printf("0\n");
        return 0;
    }
    if(nu>=2||a[0]>=su-a[0])//有两个奇数或0的个数大于等于非0个数
    {
        puts("-1");
        return 0;
    }
    if(nu)a[s]--;
    if(a[0]!=0)
    {
        for(int i=1; i<10; ++i)
            if(a[i]&&a[i]!=1)
            {
                a[i]--;
                ans[++cn]=(char)(i+'0');
                for(int i=0; i<10; ++i)//处理前一半
                {
                    if(a[i])
                    {
                        a[i]/=2;
                        while(a[i]--)
                            ans[++cn]=(char)(i+'0');
                    }
                }
                if(nu==1)   //有奇数时,在末尾添加奇数
                ans[++cn]=s+'0';
                break;
            }
    }
    else
    {
        for(int i=0; i<10; ++i)
        {
            if(a[i])
            {
                a[i]/=2;
                while(a[i]--)
                    ans[++cn]=i+'0';
            }
        }
        if(nu==1)
        ans[++cn]=s+'0';
    }
    for(int i=1; i<=cn; ++i)//利用对称复制
        ans[su-i+1]=ans[i];
    for(int i=1; i<=su; ++i)
        printf("%c",ans[i]);
    puts("");
    return 0;
}


全部评论
0>=非0为什么不行,如果我2个02个1,完全可以1001构造出来a
1
送花
回复
分享
发布于 2022-01-30 00:24

相关推荐

点赞 评论 收藏
转发
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务