题目大意:可执行任意次操作,操作内容:找两个元素,其中一个必须是偶数,偶数元素除2,另一个元素乘2,问怎么做才能使整个数组元素之和最大
思路:初步思路使放大某个元素,把除该元素外所有的元素都除/2到底,以此使该元素放到最大,这样肯定比均分求和要大,但这个元素如何选择?应该选底数最大的,也就是说把数组内所有元素一直除2直到不能除为止,然后从这些数里挑最大的放大,由于底数更大,所以每次乘2放大肯定也更大
Code:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100;
typedef long long LL;
int n,a[N],backup[N];
void solve()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
memcpy(backup,a,sizeof a);
for(int i=0;i<n;i++)
{
while(backup[i]%2==0)
{
backup[i]/=2;
}
}
int temp=-1,j=0;
for(int i=0;i<n;i++)
{
if(temp<backup[i])
{
temp=backup[i];
j=i;
}
}
LL ans=a[j];
for(int i=0;i<n;i++)
{
if(i==j)
{
continue;
}
while(a[i]%2==0)
{
ans*=2;
a[i]/=2;
}
}
LL res=0;
for(int i=0;i<n;i++)
{
if(i==j)
{
res+=ans;
continue;
}
res+=a[i];
}
cout<<res<<endl;
}
int main()
{
int T;
cin>>T;
for(int i=0;i<T;i++) solve();
return 0;
}