hdu 5744 Keep On Movin

来源:互联网 发布:4g卡显示2g网络能用吗 编辑:程序博客网 时间:2024/05/18 05:04

Description

上回书说道不愿透露姓名的巨巨还剩下一个数组,这个数组记录了他学习c++ 语言的过程。
现在这个数组a里有一些字符,第i个字符的数量是a[i]。巨巨想用这些字符来构造一些回文串好让他的程序通过编译。
他想知道各种组合方案中最短字符串长度的最大值。
 
举个栗子:
现在有 ‘a’, ‘b’, ‘c’, ‘d’ 四种字符并且他们的数量是 {2,3,2,2} 巨巨可以构造出 { “acdbbbdca”}, { “abbba”, “cddc”}, { “aca”, “bbb”,“dcd”},或{ “acdbdca”, “bb”} 四种方案.
在以上方案中,第一个方案的最短字符串长度比其他三种方案中的最短字符串长度都长,为9。
 
回文串嘛,大家都懂的就不废话了。

Input

多组测试数据。第一行一个整形t,代表测试数据的组数。
对于每组测试数据,第一行一个整形n(1<=n<= 105),代表字符的种类数。
接下来一行n个数,a1, a2,...,an(0<=ai<=104);

Output

对于每组测试数据,输出一个代表答案的整数。·

Sample Input

441 1 2 432 2 251 1 1 1 151 1 2 2 3

Sample Output

3613

Hint

真·签到题

思路:求各组合方案中最短的字符串长度的最大值,经过分析我们发现如果所给定的字符数都为偶数,则最长的为该长度,

若为奇数,记录其中奇数字符的个数,将奇数拆分成1个+偶数个,在将剩下的所有对偶数字符均分到num个奇数中,即为最

长.

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{      int n,a,t,num,ans,sum;
       scanf("%d",&t);
       while(t--)
       {   scanf("%d",&n);
           num=0;
           sum=0;
           for(int i=1;i<=n;i++)
           {  scanf("%d",&a);
              if(a&1)
               num++;//统计奇数的个数
               sum+=a;
  }
  //printf("%d",num); 
  if(num==0)
  printf("%d\n",sum);
  else
  {    sum-=num;//将剩下的均分
       ans=sum/num;
       if(ans%2==0)//若无法均分回文只能不等分.取最小
       ans++;
       
     printf("%d\n",ans);
  }
  }
  return 0;
 } 

0 0
原创粉丝点击