MAX Average Problem(斜率优化dp)
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
6 4 2 10 3 8 5 9 4 1
题解:
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)的更多相关文章
- hdu 2993 MAX Average Problem(斜率DP入门题)
题目链接:hdu 2993 MAX Average Problem 题意: 给一个长度为 n 的序列,找出长度 >= k 的平均值最大的连续子序列. 题解: 这题是论文的原题,请参照2004集训 ...
- UVALive 4726 Average ——(斜率优化DP)
这是第一次写斜率优化DP= =.具体的做法参照周源论文<浅谈数形结合思想在信息学竞赛中的应用>.这里仅提供一下AC的代码. 有两点值得注意:1.我这个队列的front和back都是闭区间的 ...
- HDU 2993 - MAX Average Problem - [斜率DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 Consider a simple sequence which only contains p ...
- HDU 2993 MAX Average Problem dp斜率优化
MAX Average Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU 2993 MAX Average Problem(斜率优化DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...
- BNUOJ 3958 MAX Average Problem
MAX Average Problem Time Limit: 3000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Jav ...
- [BZOJ3156]防御准备(斜率优化DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3156 分析: 简单的斜率优化DP
- HDU 3045 Picnic Cows(斜率优化DP)
Picnic Cows Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 蒟蒻关于斜率优化DP简单的总结
斜率优化DP 题外话 考试的时候被这个玩意弄得瑟瑟发抖 大概是yybGG的Day4 小蒟蒻表示根本不会做..... 然后自己默默地搞了一下斜率优化 这里算是开始吗?? 其实我讲的会非常非常非常简单,, ...
随机推荐
- Android(digest)
Android开发者文档这么说的: Content providers manage access to a structured set of data. They encapsulate the ...
- 写一个产生16位纯数字唯一 ID 的方法,要求时间因素的介入。(不要求绝对唯一,在一定的时空中重复机率很小即可)
function randomID () { _random = function(min, max) { if (max == null) { max = min; min = 0; } retur ...
- 直播视频插件--sewise player
直播视频插件 -- sewise player 2017-1-9 因为公司要开发一个关于购车直播的新项目,需要在页面引入直播视频,项目组之前都没有做过关于直播类型的项目,所以可以说是真的从各种资源中筛 ...
- C#/winform 旅游管理信息系统
工具:Visual Studio 2015,sql server2014 1.系统概述 该旅游管理信息系统可以为游客和公司业务管理员提供服务.游客可以对旅游路线,旅游班次,旅游团,保险,导游,交通工具 ...
- PHP高级特性基础
php对象在内存中的区域:php对象名和对象存放的位置是不一样的,这一点和java是一模一样的,所以在php面向对象部分你完全可以套用java的思想去做.对象存放在堆区(heap)而对象名则和其他普通 ...
- ios5和ios6横竖屏支持及ipad和iphone设备的判断
ios5和ios6横竖屏支持及ipad和iphone设备的判断 判断是ipad还是iphone设备.此定义在PayViewControllerDemo-Prefix.pch 定义如下: #define ...
- hive 函数学习
NAME PRICE ---- ----- AAA 1.59 AAA 2.00 AAA 0.75 BBB 3.48 BBB 2.19 BBB 0.99 BBB 2.50 I would like to ...
- NSDictionary json格式字符串转字典,字典转json格式字符串
+ (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString { if (jsonString == nil) { return ...
- js的两种数据类型
js中的数据类型总体来说分为两种,他们分别是: 1 值类型(基本类型):数值型(Number),字符类型(String),布尔值型(Boolean),null 和 underfined 2 引用类型( ...
- HDU 1004 - Let the Balloon Rise(map 用法样例)
Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...