Keep On Movin
题目链接
题目大意
现在有一堆字符,要你用这些字符组成若干个回文串,使得这些回文串中最短的串长度最大。
题解
因为注意到长度为奇数时,最中间需要一个串来连接左右两边,所以我们处理出所有的奇数串个数,然后平分偶数串个数即可。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#define maxn 100005
using namespace std;
int T,n,a[maxn],sum,h;
int main()
{
scanf("%d",&T);
while(T--)
{
h=0;
memset(a,0,sizeof(a));
scanf("%d",&n);
sum=0;
for (int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if (a[i]&1)
{
sum+=a[i]-1;
h++;
}
else sum+=a[i];
}
if (h==0) printf("%d\n",sum);
else
{
int c=sum/(2*h);
printf("%d\n",2*c+1 );
}
}
return 0;
}