这题实在太细节,前后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;
}

京公网安备 11010502036488号