CodeForce 626E Simple Skewness (贪心+三分)

原创 2016年05月31日 10:47:46

题目:给出n个数字,求出一个子集,使得其平均数与中位数的差值最大。

解析:首先将a[1...n]从大到小排序,在固定中位数的位置后,子集的构成必然是在中位数位置的两侧选取相同个,显然,每侧要尽量选取较大的值。

可以发现,选取的个数与平均数具有凸函数性质,所以通过三分找到临界点。整体复杂度O(nlogn)。

[code]:

#include<bits/stdc++.h>

using namespace std;

const int maxn = 2e5+5;

int n,a[maxn];
int o1,o2;
double ans,s[maxn];

void init(){
    ans = -1e9;
}

double f(int p,int x,int a,int b){
    return (s[x-1]+s[p+x]-s[p]+b)/(2*x+a);
}

void sol(){
    double median;
    int i,j,p1,p2;
    int mid1,mid2,l,r,t1,t2;
    for(i = 0;i < 2*n-1;i++){
        if(i&1) p1=i/2,p2=p1+1,t1=2,t2=a[p1]+a[p2],median=1.0*t2/2.0;
        else p1=p2=i/2,t1=1,t2=a[p1],median=a[p1];
        l = 0,r = min(p1,n-p2);
        while(r-l>2){
            mid1 = l+(r-l)/3;
            mid2 = l+2*(r-l)/3;
            if(f(p2,mid1,t1,t2)>=f(p2,mid2,t1,t2)) r = mid2;
            else l = mid1;
        }
        for(j = l;j <= r;j++){
            if(ans < f(p2,j,t1,t2)-median){
                o1 = i,o2 = j;
                ans = f(p2,j,t1,t2)-median;
            }
        }
    }
    printf("%d\n",2*o2+1+(o1&1));
    for(i = 0;i < o2;i++) printf("%d ",a[i]);
    printf("%d ",a[i=o1/2]);
    if(o1&1) printf("%d ",a[i=o1/2+1]);
    for(j = 0;j < o2;j++) printf("%d ",a[++i]);
}

int main(){
    int i,j;
    scanf("%d",&n);
    for(i = 0;i < n;i++) scanf("%d",&a[i]);
    sort(a,a+n);
    reverse(a,a+n);
    s[0] = a[0];
    for(i = 1;i < n;i++) s[i] = s[i-1]+a[i];
    sol();

    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

CodeForces 626E Simple Skewness(三分)

题意:给出一个数的集合,求平均数减去中位数最大的子集。 思路:首先可以证明的是这个集合里的元素个数一定为奇数。 假设这个差最大的子集中有偶数个元素,那么去掉中间较大的元素后对平均数减小的影响比对中...

codeforces626E.Simple Skewness(三分)

Define the simple skewness of a collection of numbers to be the collection's mean minus its median. ...

Codeforces 626E. Simple Skewness(三分)详细注释

题目链接:http://codeforces.com/problemset/problem/626/EE. Simple Skewnesstime limit per test3 seconds m...

CodeForces 626E Simple Skewness

题目链接:http://codeforces.com/problemset/problem/626/E 题目大意:有k个数,选若干个数,使这几个数的平均值-中位数最大,输出任意一种方案 先排序...
  • LsFlyt
  • LsFlyt
  • 2016年02月19日 21:51
  • 269

8VC Venture Cup 2016 - Elimination Round E. Simple Skewness(枚举+三分)

题目链接:点击打开链接 题意:给你n个数, 要求选若干个数, 使得这些数的平均数减去中位数尽量大。 思路:由于该题没有顺序问题, 排好序之后我们可以枚举中位数, 可以证明, 奇数个数一定比偶数优,...

codeforces Simple Skewness

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

codeforce#420 E. Okabe and El Psy Kongroo(图论+矩阵快速幂)

题目链接E. Okabe and El Psy Kongroo分析首先对于坐标为 (x,y)(x,y) 的点,设 f(x,y)f(x,y) 表示从原点到 (x,y)(x,y) 的路径不难得到递推公式 ...

Codeforce Round #379 (Div. 2) 734 E Anton and Tree(tree 缩点 树的直径 )

题目链接734 E Anton and Tree 题目大意:一棵树上有两种不同颜色的节点,你有一种操作,一次可以改变与vv相连的同种颜色联通快的颜色,问最少多少次操作可以把树染成同样的颜色分析看了题...

Codeforce 798D(贪心)

链接:点击打开链接 题意:给出两个长度为n的数组A,B,要求从A,B中取出至多n/2+1个下标相同的元素,使得取出的A的和大于二倍A数组的总和,取出的B大于二倍B数组的总和 代码:#include...

codeforce771B Bear and Different Names 贪心or思维

记住,当你觉得很苦很累的时候,你真的在进步
  • Na_OH
  • Na_OH
  • 2017年05月02日 15:24
  • 91
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CodeForce 626E Simple Skewness (贪心+三分)
举报原因:
原因补充:

(最多只允许输入30个字)