Keep On Movin

上回书说道不愿透露姓名的巨巨还剩下一个数组,这个数组记录了他学习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

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

Sample Output

3
6
1
3

题目很简单,中文的,好理解,给出一些字符的个数,然后组成不同的回文串组合,一个组合中可以有一个或多个回文串,要把字符全用完,每个回文串组合中找出一个长度最小的,求这些最小长度的最大值。直接求奇数字符串的的个数,然后把总的字符按这个个数等分,可以求出答案。

代码:
#include <iostream>
#include <string>

using namespace std;

int main()
{
    int a;
    int t,n;
    cin>>t;
    while(t --)
    {
        int o = 0,sum = 0;
        cin>>n;
        for(int i = 0;i < n;i ++)
        {
            cin>>a;
            if(a%2)o++;
            sum += a;
        }
        if(o)
        {
            sum /= o;
            if(sum && sum % 2 == 0)sum --;//如果存在奇数个数的字符,那么形成的回文串大小一定也是奇数。
        }
        cout<<sum<<endl;
    }
}
时间: 2024-10-25 23:15:59

Keep On Movin的相关文章

Hdu 5744 Keep On Movin【思维】

Keep On Movin Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 343 Accepted Submission(s): 248 Problem Description Professor Zhang has kinds of characters and the quantity of the i-th character is

HDU5744:Keep On Movin

题意: 给出t组测试数据,每组给出正整数n表示有n种字符,接下来给出n个数表示该种字符的数目,操作一下,使得可以构造的最小回文串字符数目最大且输出. 分析: 如果每个字符出现次数都是偶数, 那么答案显然就是所有数的和. 对于奇数部分, 显然需要把其他字符均匀分配给这写奇数字符. 随便计算下就好了. 即统计所有的字符的数目,奇数则-1再加上去,并且计数器count++,完成之后就输出数目,公式为字符数目=(sum/2)/count*2+1,其实就是平均了一下. 代码: #include<cstdi

HDU 5744 - Keep On Movin

题意: 给你不同的字符每个 ai 个,让你构造一些回文串,问你能达到这些回文串长度的最小值的最大值是多少 分析: 要么直接组成单链. 要么按落单的字符的数目将成对字符分摊取最短. 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int main() 5 { 6 int t, n; 7 scanf("%d", &t); 8 while(t--) 9 { 10 long l

[HDOJ5744]Keep On Movin(水题)

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5744 题意:给你n个字符的数量,要求组合成多个回文串,问如何组合使得这个回文串集合里最短的那一条回文串最长. 分情况讨论,所给的n个字符数量都是偶数或仅有一个奇数,那么这个串可以是全部字符组合成的,长度为∑ai. 如果有两个以上的奇数量(k)字符,那么最好的方法就是平均分成k个回文串.把这些奇数量的字符数量-1,则剩下的都是偶数的了.之后平均分配给所有串,每个串的长度为(sum/2)/o

HDU 5744 Keep On Movin (贪心) 2016杭电多校联合第二场

题目:传送门. 如果每个字符出现次数都是偶数, 那么答案显然就是所有数的和. 对于奇数部分, 显然需要把其他字符均匀分配给这写奇数字符. 随便计算下就好了. #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; int main() { int T,n,a; scanf("%d",&T);

【HDU 5744】Keep On Movin

找出奇数个的数有几个,就分几组. #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define N 100005 using namespace std; int n,a[N],k,t,sum; int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n); s

HDU 5744 Keep On Movin (思维题,水题)

Problem Description Professor Zhang has kinds of characters and the quantity of the i-th character is ai. Professor Zhang wants to use all the characters build several palindromic strings. He also wants to maximize the length of the shortest palindro

xenomai安装

一.Linux内核打实时补丁 1.将下载的Linux和xenomai安装包放在/usr/src目录下,并解压文件包,命令如下 tar xjf  Linux-3.8.13.tar.bz2   tar xjf  xenomai-2.6.3.tar.bz2 2.利用/xenomai-2.6.3/scripts目录下的prepare-kernel.sh脚本进行打补丁,命令如下 cd /usr/src/xenomai-2.6.3/srcipts/prepare-kernel.sh  --arch=x86

学英语《每日一歌》之brave

[每日一歌]今天给大家推荐的是jennifer lopez(詹妮弗·洛佩兹)的一首经典老歌-<Brave>.一首英文<brave>,我个人很喜欢的一首.我不害怕,我很勇敢!时常这样鼓舞自己,再大的挫折风浪都能过去.大家自己听吧.从今天起,终结一味迎合他人的无趣人生!成功人士都是从把话勇敢说出口的那一剎那开始,摆脱了平凡的人生. 把话勇敢说出口的那一剎那,他们个个害怕得心跳加速,忍不住冒冷汗.「啊,我的人生完蛋了.」有人做好了这样的心理準备.「唉,我恐怕无法在这个业界生存了.」也有人