题意:从数列里选出若干个数,使得他们的平均数减中位数最大。

答案一定是非零数。因为你只选择一个数的时候,答案为0;

选出的数一定为奇数个。我们可以通过这个方法来证明:

上式显然大于零,证毕。

选定中位数后,向选定数列中添加新数字,一定是选择了两边可选的最大数。不断添加新数字,平均数的变化是先增后减的,所以我们可以通过二分找到它的峰值。

结合以上三点,算法就非常地显然了:枚举每一个中位数,然后二分找到对应的平均数的最大值,更新答案。

用VS写的,提交的时候要记得注释掉第一个库。

for (int i=1;i<=n;i++)

sort(a+1a+1+n);