题意:

给你一堆无序数,寻找它的一个子堆,使得子堆的平均数减中位数最大。

数字的个数n<=2e5 0<=xi<=1e6.

思路:

首先可以证明这堆数一定是奇数个,证明方法是尝试在奇数个的有序数列中加入一个数字求平均值和中位数各增加了多少。然后比较一下。

也可以考虑偶数个的序列去掉中间两个中较大的数,差值不会减小。

所以中位数一定是原先堆里的数,我们可以枚举每一个数,然后二分查找范围。

二分查找范围的原理是,随着字串长度的增加,那么差值是先增大后减小的,所以我们枚举某点和它相邻的点的斜率(大小关系),然后进行二分处理,寻找最大值。

坑点:

浮点数如果需要除法比较,把等式两边同时乘上除数的最大公约数,否则会有精确度的问题。

#include<bits/stdc++.h>
using namespace std;
double jilu[];
double bf[];
double tans=;
int pos=,len=,cet;
double ans;
int n;
double average(int m){
double sum=bf[cet+]-bf[cet-m]+bf[n]-bf[n-m];
return sum;
}
void bSearch(int l,int r){
int m;
int tmpr=r;
while(l<=r){
int m=(l+r)>>;
if(average(m)*(*(m+)+)>=average(m+)*(*m+))r=m-;
else l=m+;
}
for(int i=max(,l-);i<=min(l+,tmpr);i++){//二分不一定查找到最大的点,所以进行下调整
if(average(i)-jilu[cet]*(*i+)>tans*(*i+)){
tans=average(i)/(*i+)-jilu[cet];
pos=cet;
len=i;
}
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%lf",&jilu[i]);
}
sort(jilu,jilu+n);
for(int i=;i<=n;i++){
bf[i]=bf[i-]+jilu[i-];
}
for(int i=;i<n;i++){
cet=i;
bSearch(,min(i,n--i));
}
//printf("%d %d\n",pos,len);
printf("%d\n",*len+);
for(int i=pos;i>=pos-len;i--){
printf("%.0lf ",jilu[i]);
}
for(int i=n-;i>n--len;i--){
printf("%.0lf ",jilu[i]);
}
}

Codeforces 626E Simple Skewness 「数学」「二分」的更多相关文章

  1. Codeforces 626E Simple Skewness(暴力枚举+二分)

    E. Simple Skewness time limit per test:3 seconds memory limit per test:256 megabytes input:standard ...

  2. codeforces 626E. Simple Skewness 三分

    题目链接 给n个数, 让你去掉一些数, 使得剩下的数的平均值-中位数的差值最大. 先将数组排序, 然后枚举每一个数作为中位数的情况, 对于每个枚举的数, 三分它的左右区间长度找到一个平均值最大的情况, ...

  3. Codeforces 665D Simple Subset [简单数学]

    题意: 给你n个数,让你从中选一个子集要求子集中的任何两个数相加都是质数. 思路: 一开始把自己坑了,各种想,后来发现一个简单的性质,那就是两个数相加的必要条件是这两个数之中必定一个奇数一个偶数,(除 ...

  4. 洛谷 P4714 「数学」约数个数和 解题报告

    P4714 「数学」约数个数和 题意(假):每个数向自己的约数连边,给出\(n,k(\le 10^{18})\),询问\(n\)的约数形成的图中以\(n\)为起点长为\(k\)的链有多少条(注意每个点 ...

  5. 「kuangbin带你飞」专题二十二 区间DP

    layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - ku ...

  6. 「kuangbin带你飞」专题十九 矩阵

    layout: post title: 「kuangbin带你飞」专题十九 矩阵 author: "luowentaoaa" catalog: true tags: mathjax ...

  7. 「CF779B」「LOJ#10201.」「一本通 6.2 练习 4」Sherlock and His Girlfriend(埃氏筛

    题目描述 原题来自:Codeforces Round #400 B. Sherlock 有了一个新女友(这太不像他了!).情人节到了,他想送给女友一些珠宝当做礼物. 他买了 nnn 件珠宝.第 iii ...

  8. 精心整理「服务器Linux C/C++」 成长路程(附思维导图)

    前言 我不是名校毕业,更没有大厂的背景,我只是一个毕业不到 2 年的普普通通的程序员,在摸爬滚打的工作这段时间里,深知了有一个「完整的知识体系」是非常重要的.当事人非常后悔没有在大学期间知道这个道理- ...

  9. 「状压DP」「暴力搜索」排列perm

    「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...

随机推荐

  1. android中的EditView控件

    android中的EditView控件 EditText继承关系:View-->TextView-->EditText ,EditText是可编辑文本框 1.EditText默认情况下,光 ...

  2. Python文件处理之文件写入方式与写缓存(三)

    Python的open的写入方式有: write(str):将str写入文件 writelines(sequence of strings):写多行到文件,参数为可迭代对象 首先来看下writelin ...

  3. Oracle查找表的外键引用关系

    Oracle查找表的外键引用关系 select t1.table_name, t2.table_name as "TABLE_NAME(R)", t1.constraint_nam ...

  4. [activiti] Activiti 5.18 的Mybatis版本依赖问题

    测试activiti 是查询Task时抛出一个异常: org.apache.ibatis.exceptions.PersistenceException: ### Error querying dat ...

  5. c# 鼠标在控件上拖动 移动窗体 移动窗口

    #region 移动窗体 移动窗口 private Point _mousePoint; private int topA(Control cc) { if (cc == null || cc == ...

  6. FIR系统的递归与非递归实现

    首先,因为FIR的脉冲响应是有限长,所以总是可以非递归实现的: 其次,也可以用递归系统来实现它. 以滑动平均做例子,最直观的想法就是,每次来一个新的值,丢掉最老的,加上最新的: y[n]=y[n-1] ...

  7. 建立一个node.js服务器(使用express搭建第一个Web环境)

    一.官网下载node.js 下载地址:https://nodejs.org/en/download/ 根据向导,下一步安装就可以了! 二.使用express搭建Web环境 express是一个开源的n ...

  8. datagridview 不显示行号的问题

    环境:C#,Winform 场景: 窗体上有两个tab页A.B,每个tab页上都有一个DatagridView.窗体加载后,显示tab A选项卡.序号正常显示,但点击B选项卡后,DatagridVie ...

  9. c/c++多线程编程中最好不要加volatile

    来自https://www.zhihu.com/question/31459750 答主解释说:不能指望volatile能解决多线程竞争问题,除非所用的环境系统不可靠才会为了保险加上volatile, ...

  10. sql语句延时执行或者是指定时间执行

    --使用waitfor语句延迟或暂停程序的执行 --waitfor{delay'time'|time 'time'} delay是指间隔时间 最长到24小时 time是指定时间执行 waitfor d ...