MAX Average Problem

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

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://www.docin.com/p-47950655.html这篇论文讲的斜率优化,讲的很清楚;

给定一个长度为n的序列,从其中找连续的长度大于m的子序列使得子序列中的平均值最小。

总结就是:构造下凸折线,维护下凸折线(凸包维护),找与下凸折线相切的斜率(也可以用二分来找)

没用二分:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define SD(x) scanf("%lf",&x)
#define P_ printf(" ")
typedef long long LL;
const int MAXN=1e5+;
int sum[MAXN],s[MAXN],a[MAXN];
bool cross(int i,int j,int k){
if((sum[j]-sum[i])*(k-i)>=(sum[k]-sum[i])*(j-i))return true;
return false;
}
double flx(int i,int t){
double temp;
temp=1.0*(sum[t]-sum[i])/(t-i);
return temp;
}
int main(){
int N,k;
while(~scanf("%d%d",&N,&k)){
sum[]=;
for(int i=;i<=N;i++)SI(a[i]),sum[i]=sum[i-]+a[i];
int top=,low=;
double ans=;
for(int i=k;i<=N;i++){
int j=i-k;
while(top-low>=&&cross(s[top-],s[top],j))top--;
s[++top]=j;
while(top-low>=&&flx(s[low+],i)>=flx(s[low],i))low++;
ans=max(ans,flx(s[low],i));
}
printf("%.2lf\n",ans);
}
return ;
}

用了二分:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define SD(x) scanf("%lf",&x)
#define P_ printf(" ")
typedef long long LL;
const int MAXN=1e5+;
int sum[MAXN],s[MAXN],a[MAXN];
bool cross(int i,int j,int k){
if((sum[j]-sum[i])*(k-i)>=(sum[k]-sum[i])*(j-i))return true;
return false;
}
double flx(int i,int t){
double temp;
temp=1.0*(sum[t]-sum[i])/(t-i);
return temp;
}
int erfen(int l,int r,int i){
int mid;
while(l<=r){
mid=(l+r)>>;
if(cross(s[mid],s[mid+],i))r=mid-;
else l=mid+;
}
return r+;
}
int main(){
int N,k;
while(~scanf("%d%d",&N,&k)){
sum[]=;
for(int i=;i<=N;i++)SI(a[i]),sum[i]=sum[i-]+a[i];
int top=,low=;
double ans=;
for(int i=k;i<=N;i++){
int j=i-k;
while(top-low>=&&cross(s[top-],s[top],j))top--;
s[++top]=j;
ans=max(ans,flx(s[erfen(,top,i)],i));
}
printf("%.2lf\n",ans);
}
return ;
}

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

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

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

  2. UVALive 4726 Average ——(斜率优化DP)

    这是第一次写斜率优化DP= =.具体的做法参照周源论文<浅谈数形结合思想在信息学竞赛中的应用>.这里仅提供一下AC的代码. 有两点值得注意:1.我这个队列的front和back都是闭区间的 ...

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

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

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

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

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

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

  6. BNUOJ 3958 MAX Average Problem

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

  7. [BZOJ3156]防御准备(斜率优化DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3156 分析: 简单的斜率优化DP

  8. HDU 3045 Picnic Cows(斜率优化DP)

    Picnic Cows Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  9. 蒟蒻关于斜率优化DP简单的总结

    斜率优化DP 题外话 考试的时候被这个玩意弄得瑟瑟发抖 大概是yybGG的Day4 小蒟蒻表示根本不会做..... 然后自己默默地搞了一下斜率优化 这里算是开始吗?? 其实我讲的会非常非常非常简单,, ...

随机推荐

  1. Map map=new HashMap(); 为什么是这样

    Map是接口,hashMap是Map的一种实现.接口不能被实例化. Map map=new HashMap(); 就是将map实例化成一个hashMap.这样做的好处是调用者不需要知道map具体的实现 ...

  2. Linux 上的数据可视化工具

    Linux 上的数据可视化工具 5 种开放源码图形化工具简介 Linux® 上用来实现数据的图形可视化的应用程序有很多,从简单的 2-D 绘图到 3-D 制图,再到科学图形编程和图形模拟.幸运的是,这 ...

  3. [Leetcode][Python]44:Wildcard Matching

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 44:Wildcard Matchinghttps://oj.leetcode ...

  4. c++冒泡排序的模板函数设计

    说明 由于课程设计需要,特编写本程序.本程序首先定义了一个冒泡程序的模板函数,然后在main()函数中定义了两个不同类型的数组,调用模板函数对其进行排序.(注意,本程序是在linux下编写,但是直接拷 ...

  5. chrome插件 postman 可以调用restful服务

    chrome插件 postman 可以调用restful服务

  6. Java日志管理

    首页 资讯 精华 论坛 问答 博客 专栏 群组 更多 ▼ 您还未登录 ! 登录 注册 JavaCrazyer的ItEye(codewu.com)技术博客   博客 微博 相册 收藏 留言 关于我   ...

  7. ios9配置info.plist中关于安全访问问题

    打开info.plist文件 - >添加App Transport Security Settings 字典类型,在App Transport Security Settings下增加Allow ...

  8. C# 知识点回顾

    一.基础知识 1.主函数:主函数是程序运行的入口. 2.数据类型: 值类型:整形(有符号.无符号)浮点型(float.double.decimal) 字符型(char.datetime) 结构体(范例 ...

  9. javascript 手机号抽奖

     案例   ----           手机号抽奖   开始抽奖  停止                                                       *具体的备注在代 ...

  10. Poem: Reserverd Words

    Let this long package float, Goto private class if short. While protected with debugger case, Contin ...