当日总结
链接:https://ac.nowcoder.com/acm/contest/19851/1005
来源:牛客网
Froggy 分别给出 10 个数码的出现次数,你需要找到一个由这些数码组成的最小的数,满足:
- 这个数是回文的。
- 不能有前导 0。
注:假设这个数字长度是
𝐿
L,那么这个数是回文的当且仅当对于任意的
𝑖
∈
[
1
,
𝐿
]
i∈[1,L],第
𝑖
i 位的数码和第
𝐿
−
𝑖
1
L−i+1 位的数码相同。
快来帮帮 Froggy 吧!
输入描述:
一行 10 个自然数,分别表示数码
0
∼
9
0∼9 的出现次数。
输出描述:
如果无解,只输出 “-1”。(不含引号)
否则,输出一个数表示最小的解。
include<stdio.h>
int main()
{
int str[10]={0};
int i=0,flag_ji=0;
int sum=0;
for(i=0;i<10;i++)
{
scanf("%d",&str[i]);
sum+=str[i];
if(str[i]%2!=0&&str[i]!=0)
{
flag_ji++;
}
}
if(flag_ji>1)
{
printf("-1");
return 0;
}
if(sumstr[0])
{
if(str[0]1)
printf("0");
else
printf("-1");
return 0;
}
if(sum-str[0]<2)
{
printf("-1");
return 0;
}
int left=0,right=sum-1,j=0,k=0,flag=0;
int result=(int)malloc(sizeof(int)*sum);
for(i=1;i<10;i++)
{
if(str[i]0)
{
continue;
}
for(j=0;j<str[i]/2;j++)
{
result[left++]=i;
result[right--]=i;
if(str[0]>0&&flag0)
{
for(k=0;k<str[0]/2;k++)
{
result[left++]=0;
result[right--]=0;
}
flag=1;
}
}
}
int index=0;
for(i=0;i<10;i++)
{
if(str[i]%2!=0)
{
index=i;
break;
}
}
if(flag_ji==1)
{
result[right]=index;
}
for(i=0;i<sum;i++)
{
printf("%d",result[i]);
}
return 0;
}

浙公网安备 33010602011771号