Best Cow Fences

Time Limit: 1000MS Memory Limit: 30000K

Description

Farmer John’s farm consists of a long row of N (1 <= N <= 100,000)fields. Each field contains a certain number of cows, 1 <= ncows <= 2000.

FJ wants to build a fence around a contiguous group of these fields in order to maximize the average number of cows per field within that block. The block must contain at least F (1 <= F <= N) fields, where F given as input.

Calculate the fence placement that maximizes the average, given the constraint.

Input

* Line 1: Two space-separated integers, N and F.

* Lines 2..N+1: Each line contains a single integer, the number of cows in a field. Line 2 gives the number of cows in field 1,line 3 gives the number in field 2, and so on.

Output

* Line 1: A single integer that is 1000 times the maximal average.Do not perform rounding, just print the integer that is 1000*ncows/nfields.

Sample Input

10 6

6

4

2

10

3

8

5

9

4

1

Sample Output

6500

Source

USACO 2003 March Green

/*
01分数规划思想+DP做法.
求长度不小于k连续一段的最大平均值.
ans=(sum[j]-sum[i-1])/(j-i+1) [j-i+1>=k]
这样的话我们二分一个ans,然后让每个数都减去ans.
最后DP检验最大的连续和是否大于0即可.
复杂度O(nlogn).
*/
#include<iostream>
#include<cstdio>
#define MAXN 100001
#define eps 1e-6
using namespace std;
double ans,s[MAXN],sum[MAXN],max1,min1=1e9;
int n,k;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
bool check(double x)
{
double tot,m=0;
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+s[i]-x;
for(int i=k;i<=n;i++)
{
tot=sum[i]-m;
if(tot>=0) return true;
m=min(m,sum[i-k+1]);
}
return false;
}
void erfen(double l,double r)
{
double mid;
while(l+eps<=r)
{
mid=(l+r)/2;
if(check(mid)) ans=mid,l=mid;
else r=mid;
}
int x=r*1000;
printf("%d\n",x);
return ;
}
int main()
{
int x;
while(~scanf("%d %d",&n,&k))
{
max1=0,min1=1e9;
for(int i=1;i<=n;i++)
{
s[i]=read();
sum[i]=sum[i-1]+s[i];
max1=max(max1,s[i]),min1=min(min1,s[i]);
}
erfen(min1,max1);
}
return 0;
}
/*
斜率优化题.
通过此题大概知道了斜率优化是什么.
因为ans=(sum[j]-sum[i-1])/(j-i+1) [j-i+1>=k].
所以我们可以将看做二维平面中的两个点(i-1,sum[i])和(j,sum[j]).
ans即为两点之间的斜率.
我们要让ans最大化.
n^2的暴力可以看做是有一个点t,和点集Gt{x,0<=x<=t-k},
扫描G中的每个点,使斜率最大化.
但是有些点对于决策是没有影响的.
现在有一个定理:
存在三个有序点i,j,k,如果满足k(i,j)>k(k,j)
即j点是直线ik上方的点,那它不会对决策产生影响.
证明的话见2004周源国家集训队论文,讲的很清楚.
这样的话我们维护一个下凸折线就好了.
我们每次都加入位置为i-k的点,维护下凸性.
如果某一点j(0<=j<=i-k)与点i的斜率最大,
则这个点显然一定是下凸折线的切点.
则它之前的点连线斜率较小也不会对决策产生影响
删掉就可以了.
这样的话由于每个点只入队出队一次
所以复杂度是O(n)的.
参考资料 2004周源国家集训队论文.
*/
#include<iostream>
#include<cstdio>
#define MAXN 100001
using namespace std;
double ans,sum[MAXN],max1,min1=1e9;
int n,k;
struct data{double x,y;}q[MAXN];
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
double check(data a,data b,data c)
{
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
double Get(data a,data b)
{
return (b.y-a.y)/(b.x-a.x);
}
void slove()
{
data x,now;ans=0;
int head=0,tail=0;
for(int i=k;i<=n;i++)
{
x.x=i-k,x.y=sum[i-k];
while(tail-head>=2&&check(q[tail-2],q[tail-1],x)<0) tail--;//维护下凸性.
q[tail++]=x;
now.x=i,now.y=sum[i];
double k=Get(q[head],now);
while(tail-head>0&&Get(q[head+1],now)>k)//删除没用的点.
{
k=Get(q[head+1],now);
head++;
}
ans=max(ans,k);
}
ans*=1000;
int a=ans;
printf("%d\n",a);
}
int main()
{
int x;
while(~scanf("%d %d",&n,&k))
{
for(int i=1;i<=n;i++)
x=read(),sum[i]=sum[i-1]+x;
slove();
}
return 0;
}

Poj 2018 Best Cow Fences(分数规划+DP&&斜率优化)的更多相关文章

  1. POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)

    $ POJ~2018~Best~Cow~ Fences $(二分答案构造新权值) $ solution: $ 题目大意: 给定正整数数列 $ A $ ,求一个平均数最大的长度不小于 $ L $ 的子段 ...

  2. POJ 2018 Best Cow Fences(二分+最大连续子段和)

    Best Cow Fences Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14601 Accepted: 4720 Desc ...

  3. BZOJ2402: 陶陶的难题II(树链剖分,0/1分数规划,斜率优化Dp)

    Description Input 第一行包含一个正整数N,表示树中结点的个数.第二行包含N个正实数,第i个数表示xi (1<=xi<=10^5).第三行包含N个正实数,第i个数表示yi ...

  4. POJ 2018 Best Cow Fences(二分答案)

    题目链接:http://poj.org/problem?id=2018 题目给了一些农场,每个农场有一定数量的奶牛,农场依次排列,问选择至少连续排列F个农场的序列,使这些农场的奶牛平均数量最大,求最大 ...

  5. POJ 2018 Best Cow Fences(二分最大区间平均数)题解

    题意:给出长度>=f的最大连续区间平均数 思路:二分这个平均数,然后O(n)判断是否可行,再调整l,r.判断方法是,先求出每个数对这个平均数的贡献,再求出长度>=f的最大贡献的区间,如果这 ...

  6. POJ 2018 Best Cow Fences

    斜率优化. 设$s[i]$表示前缀和,$avg(i,j)=(s[j]-s[i-1])/(j-(i-1))$.就是$(j,s[j])$与$(i-1,s[i-1])$两点之间的斜率. 如果,我们目前在计算 ...

  7. 【BZOJ-4518】征途 DP + 斜率优化

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 230  Solved: 156[Submit][Status][ ...

  8. 【BZOJ-3437】小P的牧场 DP + 斜率优化

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 705  Solved: 404[Submit][Status][Discuss ...

  9. 【BZOJ-1010】玩具装箱toy DP + 斜率优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][St ...

随机推荐

  1. RAC环境备份,RMAN异机在单实例环境恢复redo问题

    目的:客户环境11.2.0.4 ,多节点RAC环境,现在使用带库的备份,在单机环境测试备份有效性 1.normal参数文件 删除集群相关参数cluster 2.mount 使用备份的控制文件进行还原 ...

  2. 前后端API交互如何保证数据安全性

    前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合.无论是开发原生的APP还是webapp还是PC端的软件,只要是前后端分离的模式,就避免不了调用后端提 ...

  3. SpringBoot与整合其他技术

    SpringBoot与整合其他技术 5.1 SpringBoot整合Mybatis 5.1.1 添加Mybatis的起步依赖 <!--mybatis起步依赖--> <dependen ...

  4. C# vb .net实现移除透明度效果

    在.net中,如何简单快捷地实现Photoshop滤镜组中的移除透明度效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 ...

  5. 前端开发 vue,angular,react框架对比2

    在过去一年里,前端开发发展迅速,前端工程师的薪资亦是水涨船高.2019 更是热度不减,而作为近年来尤为热门的前端框架,Vue.js 自是积累了大量关注.那么,Vue.js 是适合你的框架吗?     ...

  6. Vue使用QRCode.js生成二维码

    1.安装qrcode npm install qrcode 2.组件中引入qrcode import QRCode from 'qrcode' 3.html代码 <div><span ...

  7. [SOLVED] “Error 1067: The process terminated unexpectedly” on Windows 10, 7 & 8

    Windows background services enable Windows features function properly. If some errors happen to serv ...

  8. UCOSIII内嵌信号量

    不仅能够简化代码,而且比使用独立的信号量更有效 API函数 //等待-1 OS_SEM_CTR OSTaskSemPend (OS_TICK timeout, OS_OPT opt, CPU_TS * ...

  9. python网络爬虫入门(二)

    刚去看了一下,18年2月份写了第一篇关于爬虫的文章(仅仅介绍了使用requests库去获取HTML代码),一年多之后看来很稚嫩也没有多少参考的意义,但没想着要去修改它,留着也是一个回忆吧.至少证明着我 ...

  10. DBUtils模块

    Python 中的数据库连接池 DBUtils是Python的一个用于实现数据库连接池的模块. 有两种模式 模式一:为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到 ...