MAX Average Problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5803    Accepted Submission(s): 1433

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
 
 
这道题不是普通的斜率优化,详细题解参见:http://blog.sina.com.cn/s/blog_ad1f8960010174el.html
由于把题目数据范围从10^4提到了5*10^5,我用自己出的数据对拍,网上的标程基本爆掉。
只有一点要注意,就是不加读入优化绝对TLE。一般O(n)的题都是这样。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long double real;
#define MAXN 510000
#define max(x,y) ((x)>(y)?(x):(y))
typedef long long qword;
int num[MAXN];
int sum[MAXN];
int n;
real f[MAXN];
real ans=;
struct Point
{
qword x,y;
}pl[MAXN];
int topl=-;
qword xmul(Point p1,Point p2,Point p3)
{
return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x);
}
real get_k(Point p1,Point p2)
{
return real(p1.y-p2.y)/(p1.x-p2.x);
}
inline int getInt(int &ret)
{
char ch=getchar();
ret=;
while (ch>''||ch<'')ch=getchar();
while ()
{
ret=ret*+ch-'';
ch=getchar();
if (ch>''||ch<'')break;
}
} int main()
{
freopen("input.txt","r",stdin);
int i,j,k;
while (~scanf("%d%d",&n,&k))
{
Point pp;
for (i=;i<=n;i++)
{
// scanf("%d",&num[i]);
getInt(num[i]);
sum[i]=sum[i-]+num[i];
}
/*
for (i=1;i<=n;i++)
{
for (j=i-k+1;j>=1;j--)
{
ans=max(ans,real(sum[i]-sum[j-1])/(i-j+1));
}
}*/
ans=;
int ptr=-;
int now;
Point pi;
int head=;
topl=-;
for (i=;i<=n;i++)
{
now=i-k;
if (now<)continue;
pi.x=i;pi.y=sum[i];
pp.x=now;
pp.y=sum[now];
if (topl<=head)
{
pl[++topl]=pp;
}else
{
while (topl>=head+&&xmul(pl[topl-],pl[topl],pp)<=)
{
topl--;
}
pl[++topl]=pp;
}
while (ptr==-||(ptr<topl&&get_k(pl[ptr],pi)<=get_k(pl[ptr+],pi)))
{
ptr++;
head=ptr;
}
if (ans<get_k(pl[ptr],pi))
{
--++i;
}
ans=max(ans,get_k(pl[ptr],pi));
}
printf("%.2lf\n",(double)ans);
}
return ;
}

HDU 2993 MAX Average Problem dp斜率优化的更多相关文章

  1. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

  2. HDU 2993 MAX Average Problem(斜率优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 Problem Description Consider a simple sequence w ...

  3. HDU 2993 MAX Average Problem(斜率DP经典+输入输出外挂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给出n,k,给定一个长度为n的序列,从其中找连续的长度大于等于k的子序列使得子序列中的 ...

  4. hdu 2993 MAX Average Problem(斜率DP入门题)

    题目链接:hdu 2993 MAX Average Problem 题意: 给一个长度为 n 的序列,找出长度 >= k 的平均值最大的连续子序列. 题解: 这题是论文的原题,请参照2004集训 ...

  5. MAX Average Problem(斜率优化dp)

    MAX Average Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  6. 数据结构:HDU 2993 MAX Average Problem

    MAX Average Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. HDU 2993 - MAX Average Problem - [斜率DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 Consider a simple sequence which only contains p ...

  8. HDU 3507 Print Article(DP+斜率优化)

     Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...

  9. HDU 3669 [Cross the Wall] DP斜率优化

    问题分析 首先,如果一个人的\(w\)和\(h\)均小于另一个人,那么这个人显然可以被省略.如果我们将剩下的人按\(w[i]\)递增排序,那么\(h[i]\)就是递减. 之后我们考虑DP. 我们设\( ...

随机推荐

  1. oracle本月、上月、去年同月第一天最后一天

    select trunc(sysdate, 'month') 本月第一天,        trunc(last_day(sysdate)) 本月最后一天,        trunc(add_month ...

  2. CGI与FastCGI 转

    CGI与FastCGI 当我们在谈到cgi的时候,我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html.事物总是不 断 ...

  3. 将Java应用注册为后台服务

    项目中有一个java应用程序,交付后用户要求要把这个程序做成后台服务程序,即:系统启动后该程序可以自动启动,并且在前台不要出现运行窗口,维护人员只要在“服务管理”(Windows)中选择启动或停止即可 ...

  4. Android开发之使用广播监听网络状态变化

    我们经常需要判断网络状态的变化,如有无网络,所以需要监听网络状态的变化,比如网络断开,网络连接给予友好提示.如何监听网络状态的变化呢,最近工作中需要用到这个,于是就用广播机制来实现了网络状态的监听. ...

  5. iOS UIKit:Navigation Controllers

    navigation controller是一种层次结构的container view controller,即其通过一个view controllers栈来管理内部的content view con ...

  6. Installing the .NET Framework 4.5, 4.5.1

    This article provides links for installing the .NET Framework 4.5 and 4.5.1 on your computer.  If yo ...

  7. Powerdesigner中如何生成测试数据

    设计表完成以后,我们需要生成一些测试数据,可以直接更新到数据库中,下面我们就来试试: 第一步:建立需要的Profiles测试文件,[Model]--[Test Data Profiles],如图所示: ...

  8. LCA问题

    基本概念 LCA:树上的最近公共祖先,对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. RMQ:区间最小值查询问题.对于长度为n的 ...

  9. C语言基础知识小总结(1)

    这几天在学习C语言,零零散散的学了十来天,这两天由于家里来了朋友,也没有顾得上写个总结,今天刚把朋友送走,下面就把这十来天的学习情况总结一下,一边在以后好复习与查看. 一.流程控制包括:顺序语句.判断 ...

  10. 查看alter错误,grep -A,-B,-C的妙用

    alert 日志记录了数据库的很多重要信息,要养成时常检查alert日志的习惯,但如果日志很大vi打开翻来覆去找着麻烦,怎么做的可以查错呢? 看我的测试 [oracle@ahjcyl-db bdump ...