1. 程式人生 > 其它 >HDU 5744 Keep On Movin (貪心)

HDU 5744 Keep On Movin (貪心)

HDU 5744 Keep On Movin

Mean

給定\(n\)個字元,每個字元的數量為\(a_i\),需要你構造出若干組迴文串,求所有組合方案中最短長度的最大值。

Sol

貪心

計手上相等對數目為\(num\)

\(a[i]\)為奇數的情況取到剩下1,此時手上的相等對數量加上\(a[i]/2\)

\(a[i]\)為偶數的情況下全部取完,此時手上的相等對數量加上\(a[i]/2\)

\(cnt\)\(a\)中奇數的個數。

\(cnt=0\),則答案為\(num*2\)

否則,將所有對均分給這些奇數個位置,答案為\(2*num/cnt+1\)

Code

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define dep(i,a,b) for(int i=(a);i>=(b);--i)
#define lowbit(x) (x&(-x))
#define debug(x) cout<<#x<<" :"<<x<<endl
#define debug1(x) cout<<#x<<" :"<<x<<" "
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=2e5+20;
const int MAX=10000007;
inline int read() {
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
    return x*f;
}

inline void out(int x) {   
  if(x>9) out(x/10);   
  putchar(x%10+'0'); 
}     
int q[N];
int n;
int main(){
  int T=read();
  while(T--){
      n=read();
      int sum = 0;
      int od = 0;
      rep(i,1,n){
        q[i]=read();
        if(q[i]&1){
          od++;
          sum+=q[i]/2;
        }
        else sum+=q[i]/2;
      }
      if(!od)printf("%d\n",sum*2);
      else printf("%d\n",sum/od*2+1);
  }
  return 0;
}