CodeForces - 626E Simple Skewness 结论+三分
题目链接
题意:
给定一个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 结论+三分相关推荐
- CodeForces - 626E Simple Skewness
Update on 2022.7.10\text{Update on 2022.7.10}Update on 2022.7.10: 一份更清晰的口胡. 首先可以证明选择偶数个是不优的,为了简化证明过程 ...
- CF626E. Simple Skewness
CF626E. Simple Skewness Solution 先排序. nnn为奇数时,枚举中位数,两边贪心地选择最大的数,显然平均数是凸函数,三分即可确定最值. 当nnn为偶数时,必然选择最大值 ...
- 【CodeForces 626E】Simple Skewness
题意 给出n个数的集合,求一个 (平均数-中位数)最大 (偏度最大)的子集,输出子集元素个数和各个元素(任意顺序). 分析 因为是子集,所以不一定是连续的序列.然后我们有下面几个结论. 1.最大偏度一 ...
- codeforces Simple Skewness
思路:看到0 ≤ xi ≤ 1 000 000的数据范围想到可不可以枚举中位数 k的个数为奇数的时候好弄 k的个数为偶数的时候就不行了 证明发现k的个数只能为奇数(开始想的时候去证没有正对== 证明如 ...
- CodeForces 655C Enduring Exodus (三分)
题意:n个房间,k头牛和1个人,有的房间已经被占了,要求选择k+1个房间,使得人住的房间离最远的牛距离最短. 题解:三分 题目给出01字符串,只考虑距离,先把0的编号提取到单独的数组中,由于人到牛的距 ...
- CF626E Simple Skewness
一.题目 点此看题 二.解法 首先需要排除长度偶数的情况,考虑删去较大的那一个,然后列式子可以证明平均数−-−中位数变大了(确实可以证,我们老师证出来了,但限于篇幅就不展开) 发现值很小,可以先枚举中 ...
- [CF626E]Simple Skewness
题目 传送门 to luogu 思路 好像非常麻烦的题.没有任何思路. 但是,考虑一共选择偶数个的情况.可以将每个数都减去一个值,使得中位数为 r2\frac{r}{2}2r .假设其他的数的和为 ...
- Codeforces 962F DFS 树
题意 传送门 Codeforces 962F Simple Cycles Edges 题解 任一个简单环,都可以通过取 DFSDFSDFS 树单条非树边与树边构成的环的集合 SSS 的任意子集异或得到 ...
- 第五讲 类的封装和类的继承
第五讲 类的封装和类的继承 主要内容 软件包的创建和使用 Java访问权限修饰词 类的访问权限修饰词 Java中类的层次结构和类的继承 对象的初始化再讨论 软件包的创建和使用 什么是软件包(pac ...
最新文章
- GridView标题行换行之我见 (转)
- 2021牛客暑期多校训练营(二) J. Product of GCDs 不动脑子的莫比乌斯反演做法(
- 越小越好:为什么电子器件都这么小巧玲珑?
- mysql的结构,段页区,及客户端命令
- hdu 1078(记忆化搜索)
- HDU 4787 GRE Words Revenge
- Android P 开发者预览版
- [设计模式-结构型]外观模式(Facade)
- IPLATUI----Grid校验
- linux下sort详解(sort对科学记数法的排序)
- centos7.0上安装五笔输入法
- 机器学习基础(二十六)—— 将 SVM 推广到多类问题
- 23种设计模式(二十四)领域规则之解析器
- Ubuntu 意外死机 (Linux Crash/Hang)解决
- 非对称TSP问题(asymmetric travelling salesman problem)与对称TSP问题的转换
- java批量添加注解到所有业务接口
- Java基础学习笔记(二)_Java核心技术(进阶)
- 网络安全——黑客的技术操作原来是这样的
- 求频率的公式是什么计算机,cpu时钟频率计算公式_CPU频率计算方法详解
- 信贷系统——增加2种模式访问模式A模式(通过销售人员入户的)B模式(通过Erp入户的)
热门文章
- 学计算机的人用的壁纸,桌面心理学:你的电脑桌面透露了什么?
- 深度学习在超分辨率重建上的应用SRCNN,FSRCNN,VDSR,DRCN,SRGAN
- Eclipse Validating缓慢的优化
- YOLOv5训练报错:result type Float can‘t be cast to the desired output type __int64
- 直播软件搭建技术原理:CDN 与直播
- matlab数据显示格式,MATLAB的数据显示格式和控制运算精度
- Gunicorn入门学习
- python的return怎么用_python中return如何使用
- 10个创业项目,月赚三五千不成问题
- 爬虫Xpath语法详解