小X的回文串
小X的回文串
时间限制: 1 Sec 内存限制: 128 MB题目描述
小X最近拿到了一堆的字符,一共n种,第i种字符有ai个。
现在小X准备用这些字符来拼若干个回⽂串(至少一个),并且想使最短的回文串长度尽可能大,为了方便,你只要告诉他答案就可以了。
现在小X准备用这些字符来拼若干个回⽂串(至少一个),并且想使最短的回文串长度尽可能大,为了方便,你只要告诉他答案就可以了。
输入
第一行一个正整数T,表示数据组数。
接下来每组数据第一行为一个正整数n,表示小X拿到的字符种类数,
接下来n个整数a1到an,分别表示第1到第n种字符的数量。
接下来每组数据第一行为一个正整数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 }

浙公网安备 33010602011771号