Meaning Mean


Meaning Mean


题型分析

简单数论

题目描述&数据范围

对一个长度为 $n$ 的数组 $a$ 进行如下操作:

  • 每次选择两个不同的数 $a_i,a_j$ 删除这两个数并且在数组的末尾加入 $\lfloor \frac{(a_i+a_j)}{2}\rfloor$

重复这个操作直到 $a$ 中只剩下一个数,求最后剩下的数的最大值

数据保证:

$1\le n\le 50$

$1\le a_i\le 10^9$

题解

每次操作越大的数对答案的贡献度损失越大,可以贪心的从最小的数开始操作

排个序就能解决

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

void solve(){
	int n;cin>>n;
	vector<ll>a(n+1);
	for(int i=1;i<=n;++i){
		cin>>a[i];
	}
	sort(a.begin()+1,a.end());
	ll sum=0;
	for(auto v:a){
		if(!sum)sum=v;
		else sum=(sum+v)/2;
	}
	cout<<sum<<'\n';
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    /fstream in("in.txt",ios::in);cin.rdbuf(in.rdbuf());
	int T=1;cin>>T;
	while(T--)solve();
}

文章作者: Paramec1um
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Paramec1um !
评论
  目录