HDU 5744 Keep On Movin (貪心)
阿新 • • 發佈:2021-10-04
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; }