小X的回文串

 小X的回文串

时间限制: 1 Sec  内存限制: 128 MB

题目描述

  小X最近拿到了一堆的字符,一共n种,第i种字符有ai个。
  现在小X准备用这些字符来拼若干个回⽂串(至少一个),并且想使最短的回文串长度尽可能大,为了方便,你只要告诉他答案就可以了。

输入

  第一行一个正整数T,表示数据组数。
  接下来每组数据第一行为一个正整数n,表示小X拿到的字符种类数,
  接下来n个整数a1到an,分别表示第1到第n种字符的数量。

输出

  对每组数据,输出一行一个整数,表示最大的最短回文串长度。

样例输入 Copy

  5
  4
  2 3 2 2
  4
  1 1 2 4
  3
  2 2 2
  5
  1 1 1 1 1
  5
  1 1 2 2 3

样例输出 Copy

  9
  3
  6
  1
  3

提示

  对于100%的数据,T≤10,1≤n≤105,1≤ai≤10000。

题解

  如果只有少于两种的字符是奇数个,那么答案就是字符个数的总和。

  多于两种字符的数量是奇数:假如数量为奇数的字符有sum种,总字符数量为ans,设cnt=ans/sum,cnt应该是个奇数,如果是偶数,cnt--。cnt为最终结果。

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 const int N=101000;
 5 int ans,sum,t,n;
 6 int main()
 7 {
 8     scanf("%d",&t);
 9     while(t--)
10     {
11         scanf("%d",&n);
12         ans=0;sum=0;
13         for(int i=1;i<=n;i++)
14         {
15             int x;
16             scanf("%d",&x);
17             if(x&1)
18                 sum++;
19             ans+=x;
20         }
21         if(sum<2)
22             printf("%d\n",ans);
23         else
24         {
25             ans=ans/sum;
26             if(ans%2==0)
27                 ans-=1;
28             printf("%d\n",ans);
29         }
30     }
31     return 0;
32 }

 

posted @ 2020-01-16 14:50  Johnny-English  阅读(209)  评论(0)    收藏  举报