MAX Average Problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 5825    Accepted Submission(s): 1446

Problem Description
Consider a simple sequence which only contains positive integers as a1, a2 ... an, and a number k. Define ave(i,j) as the average value of the sub sequence ai ... aj, i<=j. Let’s calculate max(ave(i,j)), 1<=i<=j-k+1<=n.
 
Input
There multiple test cases in the input, each test case contains two lines.

The first line has two integers, N and k (k<=N<=10^5).

The second line has N integers, a1, a2 ... an. All numbers are ranged in [1, 2000].
 
Output
For every test case, output one single line contains a real number, which is mentioned in the description, accurate to 0.01.
 
Sample Input
10 6
6 4 2 10 3 8 5 9 4 1
 
Sample Output
6.50

參考:kuangbin--hdu2993

直接斜率DP:O(N)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
#include <iomanip>
#define INF 99999999
typedef long long LL;
using namespace std; const int MAX=100000+10;
int n,k;
int s[MAX],q[MAX];
double dp[MAX],sum[MAX]; double GetY(int i,int j){
return sum[i]-sum[j];
} int GetX(int i,int j){
return i-j;
} double DP(){
int head=0,tail=1;
q[head]=0;
double ans=0;
for(int i=1;i<=n;++i)sum[i]=sum[i-1]+s[i]*1.0;
for(int i=k;i<=n;++i){
int j=i-k;
while(head+1<tail && GetY(j,q[tail-1])*GetX(q[tail-1],q[tail-2])<=GetY(q[tail-1],q[tail-2])*GetX(j,q[tail-1]))--tail;
q[tail++]=j;
while(head+1<tail && GetY(i,q[head])*GetX(i,q[head+1])<=GetY(i,q[head+1])*GetX(i,q[head]))++head;
dp[i]=(sum[i]-sum[q[head]])/(i-q[head]);
ans=max(ans,dp[i]);
}
return ans;
} int input(){//加速外挂
char ch=' ';
int num=0;
while(ch<'0' || ch>'9')ch=getchar();
while(ch>='0' && ch<='9')num=num*10+ch-'0',ch=getchar();
return num;
} int main(){
while(~scanf("%d%d",&n,&k)){
for(int i=1;i<=n;++i)s[i]=input();
printf("%0.2lf\n",DP());
}
return 0;
} 斜率DP+二分查找:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
#include <iomanip>
#define INF 99999999
typedef long long LL;
using namespace std; const int MAX=100000+10;
int n,k;
int s[MAX],q[MAX];
LL sum[MAX]; LL GetY(int i,int j){
return sum[i]-sum[j];
} int GetX(int i,int j){
return i-j;
} LL check(int mid,int i){
return GetY(i,q[mid+1])*GetX(q[mid+1],q[mid])-GetY(q[mid+1],q[mid])*GetX(i,q[mid+1]);
} int search(int l,int r,int i){
//由于斜率单调递增
/*int top=r;
while(l<=r){//依据i与mid的斜率 和 i与mid+1的斜率之差求切点
if(l == r && l == top)return q[l];//这里一定要注意假设切点是最后一个点须要另判,由于mid+1不存在会出错
int mid=(l+r)>>1;
if(check(mid,i)<0)r=mid-1;
else l=mid+1;
}*/
while(l<r){//依据i与mid的斜率 和 i与mid+1的斜率之差求切点
int mid=(l+r)>>1;
if(check(mid,i)<0)r=mid;
else l=mid+1;
}
return q[l];
} double DP(){
int head=0,tail=1,p;
q[head]=0;
double ans=0,dp;
for(int i=1;i<=n;++i)sum[i]=sum[i-1]+s[i];
for(int i=k;i<=n;++i){
int j=i-k;
while(head+1<tail && GetY(j,q[tail-1])*GetX(q[tail-1],q[tail-2])<=GetY(q[tail-1],q[tail-2])*GetX(j,q[tail-1]))--tail;
q[tail++]=j;
p=search(head,tail-1,i);//依据相邻点与i点的斜率之差二分查找切点
dp=(sum[i]-sum[p])*1.0/(i-p);
if(dp>ans)ans=dp;
}
return ans;
} int input(){//加速外挂
char ch=' ';
int num=0;
while(ch<'0' || ch>'9')ch=getchar();
while(ch>='0' && ch<='9')num=num*10+ch-'0',ch=getchar();
return num;
} int main(){
while(~scanf("%d%d",&n,&k)){
for(int i=1;i<=n;++i)s[i]=input();
printf("%0.2lf\n",DP());
}
return 0;
}

hdu2993之斜率dp+二分查找的更多相关文章

  1. D - Pearls HDU - 1300 斜率dp+二分

    D - Pearls HDU - 1300 这个题目也是一个比较裸的斜率dp,依照之前可以推一下这个公式,这个很好推 这个注意题目已经按照价格升序排列序,所以还是前缀和还是单调的. sum[i] 表示 ...

  2. BZOJ2726【SDOI2012】任务安排(斜率优化Dp+二分查找)

    由题目条件显然可以得到状态 f[i][j] 表示以 i 为结尾且 i 后作为断点,共做了 j 次分组的最小代价. 因此转移变得很显然:f[i][j]=min{f[k][j-1]+(s×j+sumT[i ...

  3. [SDOI2012]任务安排 BZOJ2726 斜率优化+二分查找

    网上的题解...状态就没有一个和我一样的...这让我有些无从下手... 分析: 我们考虑,正常的斜率优化满足x(i)单调递增,k(i)单调递增,那么我们就可以只用维护一个单调队列满足对于当前的x(i) ...

  4. B - Lawrence HDU - 2829 斜率dp dp转移方程不好写

    B - Lawrence HDU - 2829 这个题目我觉得很难,难在这个dp方程不会写. 看了网上的题解,看了很久才理解这个dp转移方程 dp[i][j] 表示前面1~j 位并且以 j 结尾分成了 ...

  5. usaco No Change, 2013 Nov 不找零(二分查找+状压dp)

    Description 约翰带着 N 头奶牛在超市买东西,现在他们正在排队付钱,排在第 i 个位置的奶牛需要支付 Ci 元.今天说好所有东西都是约翰请客的,但直到付账的时候,约翰才意识到自己没带钱,身 ...

  6. 斜率DP个人理解

    斜率DP 斜率DP的一版模式:给你一个序列,至多或分成m段,每段有花费和限制,问符合情况的最小花费是多少: 一版都用到sum[],所以符合单调,然后就可以用斜率优化了,很模板的东西: 如果看不懂可以先 ...

  7. 斜率DP题目

    uva 12524 题意:沿河有n个点,每个点有w的东西,有一艘船从起点出发,沿途可以装运东西和卸载东西,船的容量无限,每次把wi的东西从x运到y的花费为(y-x)*wi; 问把n个点的东西合并成k个 ...

  8. 【二分查找最优解】FZU 2056 最大正方形

    题意:现在有一个n*m的矩阵A,在A中找一个H*H的正方形,使得其面积最大且该正方形元素的和不大于 limit. 分析:开始以为是DP或者二维RMQ,其实用二分就可以做出来: 在输入时构造元素和矩阵d ...

  9. hdu3586 Information Disturbing 树形DP+二分

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3586 题目大意:给定n个敌方据点,编号1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值c ...

随机推荐

  1. Java实现邮箱发送验证码

    第一步,导入JAR包,JAR包下载地址[http://pan.baidu.com/s/1kVRvGyF] 正式代码: 首先书写一个工具类: MailUtil import javax.mail.*; ...

  2. JS中!=、==、!==、===的用法和区别

    1.对于string,number等基础类型,==和===是有区别的 1)不同类型间比较,==之比较"转化成同一类型后的值"看"值"是否相等,===如果类型不同 ...

  3. 获取request header的值

    1Sring mvc 中可以通过注解  : @RequestHeader ("host") String hostName 2httpservletrequest request ...

  4. Maven 整合 SSH 框架

    前面的一系列文章中,我们总结了三大框架:Struts2,Hibernate,Spring 的基本知识.本篇就姑且尝试着使用 Maven 这个项目构建工具来将这三个框架整合一起.说到这里,如果有对 Ma ...

  5. Java注解Annotation详解

    从JDK5开始,Java增加了Annotation(注解),Annotation是代码里的特殊标记,这些标记可以在编译.类加载.运行时被读取,并执行相应的处理.通过使用Annotation,开发人员可 ...

  6. 谷歌浏览器 插件安装配置Momentum chrome

    总之一句话就是这个Momentum插件可以把你的谷歌弄的漂亮一些,来搞一波 下载地址 http://www.cnplugins.com/down/predownnew.aspx?id=33842 下载 ...

  7. PHP+Redis 实例【一】点赞 + 热度 下篇

    这篇主要讲如何将数据保存回Mysql,但是里面还会涉及到如何将错误信息以及提示信息保存到文件里,方便以后的运维,再有就是如何使用PHP写进程BAT. Redis数据刷回数据库前的知识准备 首先针对上篇 ...

  8. Akka(38): Http:Entityof ByteString-数据传输基础

    我们说过Akka-http是一个好的系统集成工具,集成是通过数据交换方式实现的.Http是个在网上传输和接收的规范协议.所以,在使用Akka-http之前,可能我们还是需要把Http模式的网上数据交换 ...

  9. TCP/IP协议栈 -----链路层

    这节说一下链路层和ARP RARP协议 链路层: 在协议栈中链路层的目的有三个:1. 为IP模块发送或接受数据包 2.为ARP模块发送或接受ARP请求 3. 为RARP模块发送或接受RARP请求. 让 ...

  10. SubTool 电影字幕下载程序

    项目地址 https://github.com/backtracker/SubTool 程序说明 作为一个高清电影爱好者,找字幕的痛苦懂的人自然会懂.我在网上找了很久,并没有找到好用的字幕下载程序,于 ...