第三题:园艺布置
近期,百度采纳了员工们的提议,计划在总部大楼内部种植园艺,以提供更加温馨的工作环境。公司将园艺设计的任务交给了度度熊同学。
公司总部大楼内部的构造可以分为n个区域,编号为0, 1, …, n–1,其中区域i与i + 1是相邻的(0 ≤ i < n – 1)。根据员工的投票和反馈,度度熊拿到了一份数据,表明在区域i种植园艺可以获得员工的满意度为Ai。度度熊希望园艺的布置方案满足条件:
1.至少覆盖m个区域;
2.布置园艺的区域是连续的。
请帮他找到一种满足条件的方案,使布置园艺区域的员工的满意度的平均值最大。
输入描述
输入的第一行包含两个整数n和m,分别表示总区域数和至少覆盖的区域数。
第二行包含n个整数A0, A1,…, An – 1,依次表示在每个区域种植园艺可以获得员工的满意度。
输出描述
输出一行,表示员工的平均满意度的最大值。如果这个数是一个整数,则直接按整数格式输出;否则,请用最简分数表示,分子分母以“/”分割,格式见样例。
样例输入1
3 1
2 3 1
样例输入2
5 3
1 8 2 4 8
样例输出1
3
样例输出2
11/2
15
提示
样例2的正确答案为11/2,尽管22/4数值也相同,但由于没有化简,所以是错误的。
对于100%的数据,1 ≤ m ≤ n ≤ 106,1 ≤ Ai ≤ 106
思路:初看此题,既然是平均值,那就是分数规划了
sum(a[i]) / k = ans
所以 sum(a[i] - ans) = 0
二分答案 ans
当此式的最大值大于等于0时 l = mid
else r = mid
这样就转化成为求一段区间上的连续段(len >= m)最大值的问题了
由于二分要log的时间,那么如何在n的时间求出呢?
首先处理出把序列替换成a[i] - ans = b[i]
记sum[i] = b[1] ~ b[i] 的 和
那么以i结尾的连续段的最大值就是sum[i] - min(sum[k])(1 <= k <= i - m)
这样就可以在nlogn的时间处理了。
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<math.h>
4 int n,k;
5 int a[1000000],len;
6 double b[1000000],f[1000000];
7 void init()
8 {
9 scanf("%d %d",&n,&k);
10 for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
11 }
12 double cal(double limit)
13 {
14 for(int i = 1;i <= n;i++) b[i] = a[i] + b[i - 1] - limit;
15 double min = 0,ans = -100000000;
16 int p;
17 for(int i = k;i <= n;i++)
18 {
19 if (b[i - k] < min) min = b[i - k],p = i - k;
20 f[i] = b[i] - min;
21 if (f[i] > ans) {ans = f[i]; len = i - p;};
22 }
23 return ans;
24 }
25 int gcd(int a,int b)
26 {
27 if (b == 0) return a;
28 return gcd(b,a % b);
29 }
30 void work()
31 {
32 double l = 0,r = 100000000,mid;
33 while((r - l) > 0.0001)
34 {
35 mid = (l + r) / 2;
36 double t = cal(mid);
37 if (t > -0.0000001) l = mid;
38 else r = mid;
39 }
40 double u = cal(l);
41 int t = (int)(l + 0.0005);
42 double tt = double(t);
43 if (fabs(tt - l) < 0.0001) {printf("%d\n",t); return;}
44 t = (l + 0.0005) * len;
45 int tmp = gcd(t,len);
46 printf("%d/%d\n",t / tmp,len / tmp);
47 }
48 int main()
49 {
50 init();
51 work();
52 system("pause");
53 return 0;
54 }
55 P.S 由于没有数据,不保证代码可以对付所有极端精度数据,但是思想应该是对的
浙公网安备 33010602011771号