1. 程式人生 > >2017/9/3模擬賽T2

2017/9/3模擬賽T2

class win 技術分享 ima 由於 code space scanf 位數

技術分享

題解:由於題目已經提示我們這是個單峰函數,所以很容易想到三分法,所以我們就枚舉中位數,為保證平均數最大,左右兩側都從右往左取數。

代碼如下:

 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