参考:http://www.cnblogs.com/kuangbin/archive/2012/08/27/2657878.html

//#pragma warning (disable: 4786)
//#pragma comment (linker, "/STACK:16777216")
//HEAD
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <string>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
//LOOP
#define FE(i, a, b) for(int i = (a); i <= (b); ++i)
#define FED(i, b, a) for(int i = (b); i>= (a); --i)
#define REP(i, N) for(int i = 0; i < (N); ++i)
#define CLR(A,value) memset(A,value,sizeof(A))
//INPUT
#define RI(n) scanf("%d", &n)
#define RII(n, m) scanf("%d%d", &n, &m)
#define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)
#define RS(s) scanf("%s", s) typedef long long LL;
const int INF = 1000000007;
const double eps = 1e-10;
const int MAXN = 500010; int n, m;
int sum[MAXN];
int q[MAXN]; double Up(int k, int j)
{
return sum[j] - sum[k];
}
double Down(int k, int j)
{
return j - k;
} double getDp(int i, int j)
{
return (sum[i] - sum[j]) * 1.0 / (i - j);
} //o(n)法
//double solve()
//{
// int be, ed;
// be = 1;
// ed = 0;
// double ans = 0;
// double tmp = 0;
//
//// q[++ed] = 0;///
// int j;
// for (int i = m; i <= n; i++)
// {
// j = i - m;
// while (be < ed && Up(q[ed - 1], q[ed]) * Down(q[ed], j) >= Up(q[ed], j) * Down(q[ed - 1], q[ed]))
// ed--;
// q[++ed] = j;
//
// while (be < ed && getDp(i, q[be]) <= getDp(i, q[be + 1]))
// be++;
// j = q[be];
// tmp = getDp(i, j);
// ans = max(ans, tmp);
// }
// return ans;
//} ///o(n*log(n))法,不单调是可用此法
bool check(int mid, int i)
{
// if (Up(q[mid], q[mid + 1]) * Down(q[mid + 1], i) >= Up(q[mid + 1], i) * Down(q[mid], q[mid + 1])) return 1;
if (getDp(i, q[mid]) >= getDp(i, q[mid + 1])) return 1;
return 0;
} ///注意写法
int SB(int i, int l, int r)///[l, r]
{
int mid;
while (l < r)///区间长度至少为2
{
mid = (l + r) >> 1;
if (check(mid, i)) r = mid;///!!!要是mid
else l = mid + 1;
}
return l;
} double fun()
{
int top = 1;
int j;
double ans = 0, tmp = 0;
FE(i, m, n)
{
j = i - m;
while (top > 1 && Up(q[top - 1], q[top]) * Down(q[top], j) >= Up(q[top], j) * Down(q[top - 1], q[top]))
top--;
q[++top] = j; j = q[SB(i, 1, top)];
tmp = getDp(i, j);
ans = max(ans, tmp);
}
return ans;
} int getInt()
{
int x = 0;
char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9')
{
x = x * 10 + c - '0';
c = getchar();
}
return x;
} int main ()
{
int x;
while (~RII(n, m))
{
sum[0] = 0;
FE(i, 1, n)
{
x = getInt();
sum[i] = sum[i - 1] + x;
}
printf("%.2lf\n", fun());
}
return 0;
}

hdu2993 MAX Average Problem (斜率dp)的更多相关文章

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

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

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

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

  3. HDU 2993 MAX Average Problem dp斜率优化

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

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

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

  5. BNUOJ 3958 MAX Average Problem

    MAX Average Problem Time Limit: 3000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Jav ...

  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 题目大意:给出n,k,给定一个长度为n的序列,从其中找连续的长度大于等于k的子序列使得子序列中的 ...

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

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

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

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

随机推荐

  1. react.js的了解

    React很大的特点就是“轻”,再加上VDOM这个很好的idea让React非常非常快(在上面那个测试里面0.3s左右就载入完毕).另外React和Angular一个很大的不同就是React采用的是o ...

  2. Netty简单的重连机制

    其实重连机制并不是多么多高深的技术,其实就是一个在客户端做一个简单的判断,如果连接断了,那么就重新调用连接服务端的代码 当然,我们重连的动作肯定是发生在断连之后发生的,我们可以在上篇的心跳机制的基础上 ...

  3. 使用C#书写SQLite数据库增删改查语句(以及插入byte[]时遇到的问题总结)

    在没有使用SQLite这种轻量级的数据库之前,只使用过Sqlserver2008进行数据的增删改查,公司使用的是大型的ORACLE数据库,还没有真正的会使用它.那时候觉得数据库很庞大,然而遇到SQLi ...

  4. sort_region——对区域进行排序

    The operator sort_region sorts the regions with respect to their relative position. All sorting meth ...

  5. 跟我学算法-pca(降维)

    pca是一种黑箱子式的降维方式,通过映射,希望投影后的数据尽可能的分散, 因此要保证映射后的方差尽可能大,下一个映射的方向与当前映射方向正交 pca的步骤: 第一步: 首先要对当前数据(去均值)求协方 ...

  6. 利用同步辅助类CountDownLatch计算多线程的运行时间

    一.CountDownLatch jdk提供的一个同步辅助类,在完成一组在在其他线程中执行的操作前,允许一个或者多个其他的线程等待,通过调用 await() 方法阻塞,直到由于 countDown() ...

  7. HTTP 状态信息

    一.1xx 消息 该类型的状态码代表请求已被接受,需要继续处理. 100 Continue 客户端应当继续发送请求,这个临时响应是用来通知客户端的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续 ...

  8. Mysql双机热备实现数据库高可用

    mysql双主热备,也称主主互备,目的是mysql数据库高可用,只支持双机,原因是mysql的复制是一主多从,但一个从服务器只能有一个主服务器. 双机热备的条件是双机mysql版本必须一致. 服务器分 ...

  9. centos7 vnc server

    yum -y install vnc *vnc-server* vncserver vncserver :2 vncserver -geometry 1900x1024 =============== ...

  10. VUE+WebPack游戏设计:欲望都市城市图层的设计