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 }
时间: 2024-10-14 17:46:29

2017/9/3模拟赛T2的相关文章

2017 9 27 模拟赛 T2

原题题意:给出一个集合S,现满足以下关系: 实际题意:求32的n次方(这...)

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

2017 7.22 模拟赛

最水的一次模拟赛.. 点击查看题目 T1 求最后K位  那前面的数是没有比要求的 , 我们就把 10k 作为模数 ,对答案进行取模 就好了  #include <ctype.h> #include <cstdio> #define N 100005 typedef long long LL; void read(LL &x) { x=0;bool f=0; register char ch=getchar(); for(;!isdigit(ch);ch=getchar())

2017 6 11模拟赛

盘子序列 [题目描述] 有 n 个盘子.盘子被生产出来后,被按照某种顺序摞在一起.初始盘堆中如果一 个盘子比所有它上面的盘子都大,那么它是安全的,否则它是危险的.称初始盘堆为 A,另外有一个开始为空的盘堆 B.为了掩盖失误,生产商会对盘子序列做一些“处 理” ,每次进行以下操作中的一个:(1)将 A 最上面的盘子放到 B 最上面:(2)将 B 最上 面的盘子给你. 在得到所有n个盘子之后, 你需要判断初始盘堆里是否有危险的盘子. [输入格式] 输入文件包含多组数据(不超过 10 组) 每组数据的

2017/11/3模拟赛

块(block)[问题描述]拼图达人小 C 手里有 n 个 1*1 的正方形方块, 他希望把这些方块拼在一起, 使得拼出的图形周长最小, 要求方块不能重叠. 擅长拼图的小 C 一下就求出了这个周长, 顺便他想考考你会不会求.[输入格式]多组数据, 第一行一个正整数 T, 表示数据组数.接下来 T 行, 每行一个正整数 n, 表示方块数.[输出格式]输出 T 行, 每行一个正整数, 表示答案.[样例输入]3 4 1122[样例输出]81420[数据范围]对于 20%的数据, n<=20:对于 40

20180530模拟赛T2——绀碧之棺

题目背景Background qiancl 得到了一张藏宝图,上面写了一道谜题. 题目描述 Description 定义\(F(n)\)为 n 在十进制下各个数位的平方和,求区间\([a,b]\)中有多少\(n\)满足\(k\times F(n) = n\). 输入描述 (coffin.in) Input Description 一行三个正整数\(k,a,b\). 输出描述 (coffin.out) Output Description 一行一个整数表示满足条件的\(n\)的个数. 样例输入Sa

[10.4模拟赛]T2

T2 Description 现有一个\(n\)个点,\(m\)条无向边的图.要求求出从编号为\(1\)的点到编号为\(n\)的点经过的边的边权的绝对值之和最小的路径.特别的,每经过一条边,图上所有边的边权就会改变,若原边权为x,新的边权是\(\frac{1}{1-x}\). 答案保留3位小数 Input 第一行两个整数\(m\),\(n\),表示点数和边数. 接下来\(m\)行,每行三个整数\(u\),\(v\),\(x\),表示有一条连接\(u\),\(v\),边权位\(x\). Outpu

2017 无奈的模拟赛

悲剧的开始~~~~ 竞赛时间:????年??月??日??:??-??:?? 题目名称 第二题 死亡 凝视 名称 two death eyesight 输入 two.in death.in eyesight.in 输出 two.out death.out eyesight.out 每个测试点时限 1 秒 1 秒 1 秒 内存限制 512MB 512MB 512MB 测试点数目 10 10 10 每个测试点分值 10 10 10 是否有部分分 无 无 无 题目类型 传统 传统 传统 注意事项(请务必

字符串模拟赛T2

// source code from laekov for c0x17 #define PRID "fkqh" #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 200009; int n, l[maxn], q[maxn], vx[maxn], vy[maxn]; char a[maxn]; void ma