2017/9/3模拟赛T2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017/9/3模拟赛T2相关的知识,希望对你有一定的参考价值。

技术分享

题解:由于题目已经提示我们这是个单峰函数,所以很容易想到三分法,所以我们就枚举中位数,为保证平均数最大,左右两侧都从右往左取数。

代码如下:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #define MN 100005
 5 using namespace std;
 6 int n,a[MN],maxl,l,r,lm,rm;
 7 long long sum[MN];
 8 double ans=-100000;
 9 int main()
10 {
11     freopen("win.in","r",stdin);
12     freopen("win.out","w",stdout);
13     scanf("%d",&n);
14     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
15     sort(a+1,a+1+n);
16     for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];
17     double la=a[1],ra=a[1];
18     for(int i=1;i<=n;i++){
19         maxl=min(i-1,n-i); maxl=max(0,maxl);
20         l=0; r=maxl;
21         while(l<r-1){//l、r中隔1为a[i]的位置 
22             lm=l+(r-l)/3; rm=r-(r-l)/3;
23             la=(double)(sum[i-1]-sum[i-lm-1]+sum[n]-sum[n-lm]+a[i])/(double)(lm*2+1);
24             ra=(double)(sum[i-1]-sum[i-rm-1]+sum[n]-sum[n-rm]+a[i])/(double)(rm*2+1);
25             if(la<ra) l=lm+1;
26             else r=rm-1;
27         }
28         la=(double)(sum[i-1]-sum[i-l-1]+sum[n]-sum[n-l]+a[i])/(double)(l*2+1);
29         ra=(double)(sum[i-1]-sum[i-r-1]+sum[n]-sum[n-r]+a[i])/(double)(r*2+1);
30         if(la<ra) ans=max(ans,ra-(double)a[i]);
31         else ans=max(ans,la-(double)a[i]);
32     }
33     printf("%.2lf",ans);
34 }

 

以上是关于2017/9/3模拟赛T2的主要内容,如果未能解决你的问题,请参考以下文章

2017/9/3模拟赛T1

2017-9-3模拟赛T1 卡片(card)

2017-9-3 校内模拟T1卡片card

11.12 模拟赛T2 冒泡排序图

January 31st 模拟赛A T2 SHTSC2014信号增幅仪 Solution

2017 9 27 模拟赛 T2