题目


题解


做法1:

直接暴力枚举每个数是否被选出,计算平均数-中位数,并与当前答案进行比较。复杂度O(2^n),能过60%的数据。

做法2:

将每个数排序后枚举中位数。

首先,取奇数个数一定更优。容易证明,如果取偶数个数,中位数与平均数相距一定更小。

其次,除中位数以外,数一定尽量往后取,这样中位数不变,平均数增大,才能使答案最大。所以,中位数确定以后,枚举中位数两边数的个数(数都靠后取),计算答案。计算过程可以用前缀和把复杂度降到O(1)。

总的复杂度O(n^2+nlogn+n)=O(n^2),能过75%的数据。

满分做法:

还是排序后枚举中位数。

注意到题目后的一长段话,由于f(w,l)为关于l的单峰函数,可以用三分法找出最佳的l。复杂度O(nlogn+nlogn+n)=O(nlogn),能过100%的数据。

代码


 #include <stdio.h>
#include <algorithm>
#define N 100005
int n,a[N],b[N];
int min(int a,int b){return a<b?a:b;}
double calc(int i,int l) {//计算平均数-中位数
return (b[i]-b[i-l-]+b[n]-b[n-l])/(double)((l<<)+);
}
int tricalc(int i) {//三分,中位数下标为i
int l=,r=min(i-,n-i),p,q,t;//l,r为三分区间,p,q为两个点
while(l<r) {
t=(r-l)/;
p=l+t;q=r-t;
if(calc(i,p)>calc(i,q)) r=q-; else l=p+;
}
return l;
}
int main() {
double tmp,ans=0.0;
scanf("%d",&n);
for(int i=;i<=n;++i) scanf("%d",a+i);
std::sort(a+,a+n+);
for(int i=;i<=n;++i) b[i]=a[i]+b[i-];//前缀和
for(int i=;i<=n;++i) {
tmp=calc(i,tricalc(i))-a[i];//三分找出最佳l
if(tmp>ans) ans=tmp;
}
printf("%.2lf",ans);
return ;
}

偷看一眼代码

完结撒花+日常%czhou~~~

2017-9-3模拟赛T2 取数(win)的更多相关文章

  1. 【2019.8.11下午 慈溪模拟赛 T2】数数(gcd)(分块+枚举因数)

    莫比乌斯反演 考虑先推式子: \[\sum_{i=l}^r[gcd(a_i,G)=1]\] \[\sum_{i=l}^r\sum_{p|a_i,p|G}\mu(p)\] \[\sum_{p|G}\mu ...

  2. 模拟赛T2 交换 解题报告

    模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...

  3. NOIP欢乐模拟赛 T2 解题报告

    小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...

  4. 20180519模拟赛T2——pretty

    [问题描述] 小美今天对于数列很有兴趣.小美打算找出一些漂亮的序列.一个漂亮的序列的限制如下: 长度为 n ,而且数列里只包含 [1,n] 的整数. 要不是不降的序列就是不升的序列. 小美想知道有多少 ...

  5. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

  6. 20161003 NOIP 模拟赛 T2 解题报告

    Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...

  7. [模拟赛] T2 不等数列

    Description 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入">"和"<".问在所有排列中,有多少个排列恰好有k个&qu ...

  8. 【2019.8.15 慈溪模拟赛 T2】组合数(binom)(卢卡斯定理+高维前缀和)

    卢卡斯定理 题目中说到\(p\)是质数. 而此时要求组合数向质数取模的结果,就可以用卢卡斯定理: \[C_x^y=C_{x\ div\ p}^{y\ div\ p}\cdot C_{x\ mod\ p ...

  9. 【2019.8.7 慈溪模拟赛 T2】环上随机点(ran)(自然算法)

    简单声明 我是蒟蒻不会推式子... 所以我用的是乱搞做法... 大自然的选择 这里我用的乱搞做法被闪指导赐名为"自然算法",对于这种输入信息很少的概率题一般都很适用. 比如此题,对 ...

随机推荐

  1. 一文理解 Java NIO 核心组件

    同步.异步.阻塞.非阻塞 首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]. 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节). 异步:相对于同步, ...

  2. 『Numpy』np.meshgrid

    生成网格坐标,一个很好的说明图如下: 虽然xy双坐标比较常用,但实际上其输入可以是任意多的数组,输出数组数目等于输出数组数目,且彼此间shape一致. 如果输入数组不是一维的,会拉伸为1维进行计算. ...

  3. jQuery基本的属性操作

    attr和prop,prop常用来操作标签的固有属性,比方说checkbox的checked属性.select的selected属性,而attr常用来操作我们自己给标签添加的属性. $('div'). ...

  4. Python 协程实现socket并发

    socket多并发 socket可以实现单个客户端进行请求访问,它可以通过socketserver来实现并发功能呢,socketserver是通过启用多线程实现并发,在这里我们也可以通过gevent协 ...

  5. Python Redis set集合

    Set操作.Set集合就是不允许重复的列表 (无序集合) sadd(name,values) # name对应的集合中添加元素 scard(name) # 获取name对应的集合中元素个数 sdiff ...

  6. centos6安装配置zabbix3主控端

    Centos 6.5 Zabbix 3.0.4 zabbix分为zabbix-server(主控端)和zabbix-agent(被控端),本文只介绍server: 安装mysql mysql建议使用5 ...

  7. UI自动化(六)js

    HTML中的三把利器的JS 又称为JavaScript,看着好像和Java有点联系,实际上他和java半毛钱关系都没有,JavaScript和我们学习的Python.Go.Java.C++等,都是一种 ...

  8. 最短路径之Bellman-Ford——解决负权边

    Bellman-Ford算法非常简单,核心代码四行,可以完美的解决带有负权边的图. for(k=1;k<=n-1;k++) //外循环循环n-1次,n为顶点个数 for(i=1;i<=m; ...

  9. Java 基础 - 集合

    Set 集合 Set 集合通常不能记住元素的添加顺序.Set 集合不允许包含相同的元素. HashSet 是 Set 接口的实现类,按照 Hash 算法存储集合中的元素.HashSet 不是同步的,如 ...

  10. FASM学习中的一些表格

    Size operator Registers Data directives Conditions(jmp助记符)