0
点赞
收藏
分享

微信扫一扫

【HDU - 5744 】Keep On Movin (回文串性质,贪心思维,不是水题)

古月无语 2022-06-15 阅读 18

题干:

Professor Zhang has kinds of characters and the quantity of the ii-th character is aiai. Professor Zhang wants to use all the characters build several palindromic strings. He also wants to maximize the length of the shortest palindromic string. 

For example, there are 4 kinds of characters denoted as 'a', 'b', 'c', 'd' and the quantity of each character is {2,3,2,2}{2,3,2,2} . Professor Zhang can build {"acdbbbdca"}, {"abbba", "cddc"}, {"aca", "bbb", "dcd"}, or {"acdbdca", "bb"}. The first is the optimal solution where the length of the shortest palindromic string is 9. 

Note that a string is called palindromic if it can be read the same way in either direction. 

Input

There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case: 

The first line contains an integer nn (1≤n≤105)(1≤n≤105) -- the number of kinds of characters. The second line contains nn integers a1,a2,...,ana1,a2,...,an (0≤ai≤104)(0≤ai≤104).

Output

For each test case, output an integer denoting the answer.

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

题目大意:

现在这个数组a里有一些字符,第i个字符的数量是a[i]。巨巨想用这些字符来构造一些回文串好让他的程序通过编译。

他想知道各种组合方案中最短字符串长度的最大值。

举个栗子:

现在有 ‘a’, ‘b’, ‘c’, ‘d’ 四种字符并且他们的数量是 {2,3,2,2} 巨巨可以构造出{ “acdbbbdca”}, { “abbba”, “cddc”}, { “aca”, “bbb”, “dcd”},或{“acdbdca”, “bb”} 四种方案.

在以上方案中,第一个方案的最短字符串长度比其他三种方案中的最短字符串长度都长,为9。

 

解题报告:

        奇数字符串单独处理一下。(可以证明回文串中,如果有的话,奇数字符,只能有一个。)

AC代码:

#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int main()
{
ll t,n,x;
cin>>t;
while(t--) {
scanf("%lld",&n);
ll ji = 0,ou=0,sum=0;
for(int i = 1; i<=n; i++) {
scanf("%lld",&x);
if(x & 1) ji++;
sum+=x/2;
}
if(ji == 0) printf("%lld\n",sum*2);
else printf("%lld\n",2*(sum/ji)+ 1);//不加括号不对
}
return 0;
}
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
int ji,ou,all,n;
int main()
{
int t;
cin>>t;
while(t--) {
ji=ou=all=0;
cin>>n;
for(int tmp,i = 1; i<=n; i++) {
scanf("%d",&tmp);
if(tmp&1) ji++,all+=(tmp-1)>>1;
else all+=tmp>>1;
}
if(ji==0) printf("%d\n",all<<1);
else printf("%d\n",(all/ji)*2+ 1);
}


return 0 ;
}


举报

相关推荐

0 条评论