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个数,选若干个数,使这几个数的平均值-中位数最大,输出任意一种方案 先排序...

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

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

codeforces Simple Skewness

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

codeforce-24e 解题报告

Berland collider time limit per test 3 seconds memory limit per test 256 megabytes ...

【CodeForce 710E】Generate a String

Description 抽象题意:给出n(目标字符串有n个‘a’),x(增加或删除一个‘a’需要多少秒),y(复制并粘贴当前的字符串需要多少秒) 求用最少的时间,生成n个‘a’; zscod...

codeforce678E

#include #include #include #include using namespace std; #define MAX 18 double d[1<<MAX][MAX];//...

【数论】codeforce711E ZS and The Birthday Paradox

题目大意: 给n和k。 求2^n天,k个人,其中至少两人同一天生日的概率。 1 ≤ n ≤ 1018, 2 ≤ k ≤ 1018 输出分子和分母 MOD 1e6+3 求MOD前,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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