列表

详情


NC212226. 回文数

描述

Froggy 分别给出 10 个数码的出现次数,你需要找到一个由这些数码组成的最小的数满足:
1. 这个数是回文的。
2. 不能有前导 0。
注:假设这个数字长度是 ,那么这个数是回文的当且仅当对于任意的 ,第  位的数码和第  位的数码相同。
快来帮帮 Froggy 吧!

输入描述

一行 10 个自然数,分别表示数码  的出现次数。

输出描述

如果无解,只输出 “-1”。(不含引号)
否则,输出一个数表示最小的解。

示例1

输入:

0 2 4 2 0 2 0 0 0 0

输出:

1223553221

示例2

输入:

1 1 4 5 1 4 0 0 0 0

输出:

-1

示例3

输入:

4 0 2 3 0 0 0 2 0 0

输出:

20037373002

示例4

输入:

2 0 0 0 0 0 0 0 0 1

输出:

-1

说明:

注意不能有前导 0。

示例5

输入:

1 0 0 0 0 0 0 0 0 0

输出:

0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 9ms, 内存消耗: 504K, 提交时间: 2020-12-31 13:00:00

#include<bits/stdc++.h>
using namespace std;
int main(){
    int i,j=0,k=0,s=0,t,a[15];
    char ans[105];
    for(i=0;i<=9;i++){
    	scanf("%d",&a[i]),s+=a[i];
    	if(a[i]>=2&&!j&&i)j=i;
    	if(a[i]&1)k++,t=i;
	}
	if(k>1||(a[0]>1)&&!j){printf("-1\n");return 0;}
	ans[0]=ans[s-1]=j+'0',a[j]-=2;
	for(j=1,i=0;i<=9;i++)
		while(a[i]>=2)ans[j]=ans[s-j-1]=i+'0',j++,a[i]-=2;
    if(k)ans[s/2]=t+'0';
	ans[s]='\0',printf("%s\n",ans);
return 0;
}

Python3 解法, 执行用时: 38ms, 内存消耗: 4656K, 提交时间: 2022-01-24 16:01:22

l=list(map(int,input().split()))
num=''
#print(l)
for x in range(10):
    if l[x]&1:
        if num=='':
            num=str(x)
        else:
            num='-5'
            break

he=sum(l[1:])

if num=='-5':
    print(-1)
elif he<2 and l[0]>=2:
    print(-1)
else:
    s=""
    for x in range(1,10):
        s+=str(x)*(l[x]//2)
    if len(s)>0:
        s=s[0]+'0'*(l[0]//2)+s[1:]
    s+=num+s[::-1]
    print(s)
    #print(num)

上一题