【CodeForces 626E】Simple Skewness
题意
给出n个数的集合,求一个 (平均数-中位数)最大 (偏度最大)的子集,输出子集元素个数和各个元素(任意顺序)。
分析
因为是子集,所以不一定是连续的序列。然后我们有下面几个结论。
1.最大偏度一定≥0
因为一个元素时,偏度为0。
2.最大偏度子集必定有元素个数为奇数个的。
证:
如果当元素个数是偶数2*k时偏度最大,我们证明它去掉一个元素a[k+1]不会更差。
子集里排好序分别是a[i]。除去a[k+1]其它数的平均值为av
新平均值-旧平均值=av-(av+a[k+1])/2=(av-a[k+1])/2
新中位数-旧中位数=a[k]-(a[k]+a[k+1])/2=(a[k]-a[k+1])/2
且有 旧平均值-旧中位数=(av+a[k+1])/2-(a[k]+a[k+1])/2=(av-a[k])/2≥0 (否则不可能偏度最大)
所以有 平均值增量-中位数增量=(av-a[k])/2≥0
所以新的偏度肯定不会更差。
3.平均值先递增后递减
因为是奇数个,所以枚举每个数做中位数,假如左右延伸长度为j,那么要使偏度更大,我们一定是每次选剩下的里面左边最大和右边最大的数。所以剩下的数越来越小,平均值增加得越来越少,而当前平均值越来越大,到某个峰值后平均值就开始减小了。
所以可以用二分法每次取中点和中点旁边一个点判断当前平均值在增加还是减小,增加就往右找,减小就往左找。
注意:浮点数判断大小不安全,所以要转换为乘法。还有一种方法我不太理解就不说了。
代码
#include<cstdio>
#include<algorithm>
#define N 200005
#define ll long long using namespace std; ll a[N],s[N];
int n,ansi=,ansp;
double ans;
//最大偏度≥0,所以初始值就是只有第一个元素,偏度为0。 ll sum(int i,int j)
{
return s[n]-s[n-j]+ s[i]-s[i-j-] ;
} int main()
{ scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%I64d",&a[i]);
} sort(a+,a++n); for(int i=; i<=n; i++)
{
s[i]=s[i-]+a[i];
} for(int i=; i<n; i++)
{
int l=,r=min(i-,n-i),m;
ll s1,s2;
while(l<r)
{
m=l+(r-l)/;
s1=sum(i,m)*(*m+);
s2=sum(i,m+)*(*m+);
if (s1>s2)
{
r=m;
}
else
{
l=m+;
if(s1==s2)
{
break;
}
}
}
if(1.0*sum(i,l)/(*l+)-a[i]>ans)
{
ans=1.0*sum(i,l)/(*l+)-a[i];
ansi=i;
ansp=l;
}
} printf("%d\n%I64d ",ansp*+,a[ansi]);
for(int i=; i<=ansp; i++)
{
printf("%I64d %I64d ",a[ansi-i],a[n-i+]);
}
return ;
}
【CodeForces 626E】Simple Skewness的更多相关文章
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- 【30.93%】【codeforces 558E】A Simple Task
time limit per test5 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...
- 【34.57%】【codeforces 557D】Vitaly and Cycle
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【50.00%】【codeforces 602C】The Two Routes
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【30.36%】【codeforces 740D】Alyona and a tree
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【codeforces 755B】PolandBall and Game
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【29.89%】【codeforces 734D】Anton and Chess
time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【codeforces 707E】Garlands
[题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...
- 【codeforces 707C】Pythagorean Triples
[题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...
随机推荐
- git review报错一例
在线上修改代码,最后使用git review提交代码审核的时候出现报错如下:[wangshibo@115~]$ vim testfile #修改代码[wangshibo@115~] ...
- poj 1046 Color Me Less
Color Me Less Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33007 Accepted: 16050 D ...
- WPF技巧-Canvas转为位图
转自:http://www.cnblogs.com/tmywu/archive/2010/09/14/1825650.html 在WPF中我们可以将Canvas当成一种画布,将Canvas中的控件当成 ...
- C#字符格式化占位符
using System; using System.Diagnostics; using System.Text; using System.Collections; using System.Co ...
- C# LUA 闭包
许多语言中有闭包的概念,C#的闭包以lambda表达式表现,可以实现与LUA完全一样的效果. //LUA------------------------------------------------ ...
- JS第一个动画
描述:让页面中的一个盒子平稳向右移动到指定位置 <div id="div1"> <div> JS代码实现 <script type="tex ...
- 安装mysql-connector-python
安装mysql-connector-python 1.下载. wget http://dev.mysql.com/get/Downloads/Connector-Python/mysql-connec ...
- MSMQ消息队列安装
一.Windows 7安装.管理消息队列1.安装消息队列 执行用户必须要有本地 Administrators 组中的成员身份,或等效身份. 具体步骤: 开始—>控制面板—>程 ...
- Linux常用指令---系统负载
查看linux系统负载: http://www.lupaworld.com/article-217011-1.html在Linux系统中,uptime.top等命令都会有系统平均负载load aver ...
- Linux基础入门(20135207 王国伊)
实验一 Linux系统简介 一.实验心得 首个实验是简单介绍了Linux系统的简介,了解Linux系统的历史和发展.使我受益匪浅 实验二 基本概念及操作 一.学习目标 1.实验楼环境介绍 2.常用 ...