标签:
4 4 1 1 2 4 3 2 2 2 5 1 1 1 1 1 5 1 1 2 2 3
3 6 1 3
给出n个数字,代表n种字符的数量,把这些字符全部使用,来组建成回文的字符串,可能会有很多种方式,问这些方式中,其中最短的回文字符串最长有多长
解释的有点绕口....
1,对于偶数个数的字符来说,只有每次组合都在两边同时添加某种字符,肯定还是回文的,但是奇数的不能加到别的字符旁边,所以把奇数单独拿出来讨论
2,奇数可以由偶数+1得到,所以把奇数全部变成1,其他的都是偶数个了,并且都是成对存在的
3,平均分配这些成对的字符串,计算其中最少的
原先自己只想到第1步,还想着用二分去做,后来才发现自己太局限了,思路没有打开,大水题都卡了半天
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,cnt=0,sum=0;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
int tp;
scanf("%d",&tp);
if(tp&1)
{
++cnt;
}
sum+=tp/2*2;
}
int ans=sum;
if(cnt)
{
ans=sum/2/cnt*2+1;
}
printf("%d\n",ans);
}
}
标签:
原文地址:http://blog.csdn.net/liuke19950717/article/details/51993392