题目链接

题意:

给定一个n个数序列,选取一些数,使得这些数的平均数减中位数尽可能大。如有多个结果,随意输出一个。

思路:

首先先上神结论:

要想使平均数-中位数尽可能的大,则选择的数的个数一定为奇数个,偶数个一定不会比他更优.

不太对的证明?

先进行排序 
选数时有两种情况,奇数个和偶数个,分别来看,设:

奇数时 u是平均数, n个数 , x1是中位数 
偶数时 ((n*u)+x2)/(n+1)平均数 ,n+1个数, (x1+x2)/2 是中位数 
平均数大于中位数 u>x1,偶变奇时 平均数的变化量:(x2-u)/(n+1) , 中位数变化量:(x2-x1)/2 ,

中位数的变化量大于平均数的变化量。 
所以当选偶数个时我们舍弃掉中位数中较大的一个,所得的结果一定比选偶数个优,所以一定选择奇数个数。

PS :

我们知道选数的个数一定为奇数个之后,就要考虑要怎么求了.

首先可以考虑,当选出的数的个数很少,则平均值-中位数 越来越小,当选取的数很多的时候 平均-中位数也越来越小.

那么二者中间一定存在某个位置有极大值.这就满足了三分的性质,题目也正好要让我们求最大的.所以可以考虑三分.

三分的话,我们还是三分区间然后check.我们枚举每个数来当中位数,然后求平均数.中位数确定了所以我们要让平均值尽量打,那么在中位数左面的数应该尽可能选择靠近中位数的数,在中位数右边的数应该选择尽可能原理中位数的数,以此来求平均值.这个过程可以考虑维护一个前缀和来得到,因为除法会有精度损失,所以我们把最后结果都乘上一个数的个数,转化为整数来做.剩下的就很简单了.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;typedef long long ll;
const ll mod=1e9+7;
const int maxn=2e5+10;ll sum[maxn],a[maxn];
int n;
ll cal(int len,int pos)
{ll res = sum[n] - sum[n-len]+sum[pos]-sum[pos-len-1];return res;
}
int main()
{while(~scanf("%d",&n)){sum[0] = 0;ll len = 0,mid = 1,mm = 0;for(int i = 1;i <=n ;i++)scanf("%lld",&a[i]);sort(a+1,a+1+n);for(int i = 1;i <=n ;i++)sum[i] = sum[i-1]+a[i];for(int i = 2;i <=n-1;i++){int l=0,r=min(i-1,n-i),lmid,rmid;while(l<=r){lmid = l + (r-l)/3;rmid = r - (r-l)/3;ll s1 = cal(lmid,i);ll s2 = cal(rmid,i);if(s1*(2*rmid+1) < s2*(2*lmid +1))l = lmid + 1;elser = rmid - 1;}ll res = cal(l,i) - (2*l+1)*a[i];if(res*(2*len+1)>mm*(2*l+1)){mm = res;len = l;mid = i; }}printf("%lld\n",2*len+1);for(int i = mid-len;i <= mid;i++)printf("%lld ",a[i]);for(int i = n-len +1;i <= n;i++)printf("%lld ",a[i]);puts("");}return 0;
}

CodeForces - 626E Simple Skewness 结论+三分相关推荐

  1. CodeForces - 626E Simple Skewness

    Update on 2022.7.10\text{Update on 2022.7.10}Update on 2022.7.10: 一份更清晰的口胡. 首先可以证明选择偶数个是不优的,为了简化证明过程 ...

  2. CF626E. Simple Skewness

    CF626E. Simple Skewness Solution 先排序. nnn为奇数时,枚举中位数,两边贪心地选择最大的数,显然平均数是凸函数,三分即可确定最值. 当nnn为偶数时,必然选择最大值 ...

  3. 【CodeForces 626E】Simple Skewness

    题意 给出n个数的集合,求一个 (平均数-中位数)最大 (偏度最大)的子集,输出子集元素个数和各个元素(任意顺序). 分析 因为是子集,所以不一定是连续的序列.然后我们有下面几个结论. 1.最大偏度一 ...

  4. codeforces Simple Skewness

    思路:看到0 ≤ xi ≤ 1 000 000的数据范围想到可不可以枚举中位数 k的个数为奇数的时候好弄 k的个数为偶数的时候就不行了 证明发现k的个数只能为奇数(开始想的时候去证没有正对== 证明如 ...

  5. CodeForces 655C Enduring Exodus (三分)

    题意:n个房间,k头牛和1个人,有的房间已经被占了,要求选择k+1个房间,使得人住的房间离最远的牛距离最短. 题解:三分 题目给出01字符串,只考虑距离,先把0的编号提取到单独的数组中,由于人到牛的距 ...

  6. CF626E Simple Skewness

    一.题目 点此看题 二.解法 首先需要排除长度偶数的情况,考虑删去较大的那一个,然后列式子可以证明平均数−-−中位数变大了(确实可以证,我们老师证出来了,但限于篇幅就不展开) 发现值很小,可以先枚举中 ...

  7. [CF626E]Simple Skewness

    题目 传送门 to luogu 思路 好像非常麻烦的题.没有任何思路. 但是,考虑一共选择偶数个的情况.可以将每个数都减去一个值,使得中位数为 r2\frac{r}{2}2r​ .假设其他的数的和为 ...

  8. Codeforces 962F DFS 树

    题意 传送门 Codeforces 962F Simple Cycles Edges 题解 任一个简单环,都可以通过取 DFSDFSDFS 树单条非树边与树边构成的环的集合 SSS 的任意子集异或得到 ...

  9. 第五讲 类的封装和类的继承

    第五讲 类的封装和类的继承 主要内容 软件包的创建和使用 Java访问权限修饰词 类的访问权限修饰词 Java中类的层次结构和类的继承 对象的初始化再讨论   软件包的创建和使用 什么是软件包(pac ...

最新文章

  1. GridView标题行换行之我见 (转)
  2. 2021牛客暑期多校训练营(二) J. Product of GCDs 不动脑子的莫比乌斯反演做法(
  3. 越小越好:为什么电子器件都这么小巧玲珑?
  4. mysql的结构,段页区,及客户端命令
  5. hdu 1078(记忆化搜索)
  6. HDU 4787 GRE Words Revenge
  7. Android P 开发者预览版
  8. [设计模式-结构型]外观模式(Facade)
  9. IPLATUI----Grid校验
  10. linux下sort详解(sort对科学记数法的排序)
  11. centos7.0上安装五笔输入法
  12. 机器学习基础(二十六)—— 将 SVM 推广到多类问题
  13. 23种设计模式(二十四)领域规则之解析器
  14. Ubuntu 意外死机 (Linux Crash/Hang)解决
  15. 非对称TSP问题(asymmetric travelling salesman problem)与对称TSP问题的转换
  16. java批量添加注解到所有业务接口
  17. Java基础学习笔记(二)_Java核心技术(进阶)
  18. 网络安全——黑客的技术操作原来是这样的
  19. 求频率的公式是什么计算机,cpu时钟频率计算公式_CPU频率计算方法详解
  20. 信贷系统——增加2种模式访问模式A模式(通过销售人员入户的)B模式(通过Erp入户的)

热门文章

  1. 学计算机的人用的壁纸,桌面心理学:你的电脑桌面透露了什么?
  2. 深度学习在超分辨率重建上的应用SRCNN,FSRCNN,VDSR,DRCN,SRGAN
  3. Eclipse Validating缓慢的优化
  4. YOLOv5训练报错:result type Float can‘t be cast to the desired output type __int64
  5. 直播软件搭建技术原理:CDN 与直播
  6. matlab数据显示格式,MATLAB的数据显示格式和控制运算精度
  7. Gunicorn入门学习
  8. python的return怎么用_python中return如何使用
  9. 10个创业项目,月赚三五千不成问题
  10. 爬虫Xpath语法详解