HDU 2993 MAX Average Problem(斜率优化DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993
题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大值。
分析:斜率优化DP,要认真看
代码如下:
1 # include<iostream> 2 # include<cstdio> 3 # include<cstring> 4 # include<algorithm> 5 6 using namespace std; 7 8 const int maxn = 100010; 9 double a[maxn], sum[maxn]; 10 int n,k; 11 int q[maxn],head,tail; 12 13 //读入优化,否则超时 14 int GetInt() 15 { 16 char ch=getchar(); 17 while(ch<'0' || ch>'9') 18 ch = getchar(); 19 int num = 0; 20 while(ch >= '0' && ch<='9') 21 { 22 num = num*10 + ch - '0'; 23 ch = getchar(); 24 } 25 return num; 26 } 27 28 void DP() 29 { 30 head = tail =0; 31 double ans = -1; 32 for(int i=k; i<=n; i++) 33 { 34 int j = i-k; 35 //维护下凸 36 while(tail - head >=2) 37 { 38 double x1 = j - q[tail-1]; 39 double y1 = sum[j] - sum[q[tail-1]]; 40 double x2 = q[tail-1] - q[tail-2]; 41 double y2 = sum[q[tail-1]] - sum[q[tail-2]]; 42 if(x1 * y2 - y1 *x2 >= 0) 43 tail--; 44 else 45 break; 46 } 47 q[tail++] = j; 48 //寻找最优解并删除无用元素 49 while(tail - head >=2) 50 { 51 double x1 = i - q[head]; 52 double y1 = sum[i] - sum[q[head]]; 53 double x2 = i - q[head+1]; 54 double y2 = sum[i] - sum[q[head+1]]; 55 if(x1*y2 - y1*x2 >= 0) 56 head ++; 57 else 58 break; 59 } 60 double tmp = (sum[i] - sum[q[head]])/(i-q[head]); 61 ans = max(ans, tmp); 62 } 63 printf("%.2lf\n",ans); 64 } 65 66 int main() 67 { 68 //freopen("in.txt","r",stdin); 69 while(scanf("%d%d",&n,&k)!=EOF) 70 { 71 sum[0] = 0; 72 for(int i=1; i<=n; i++) 73 { 74 a[i] = GetInt(); 75 sum[i] = sum[i-1] + a[i]; 76 } 77 DP(); 78 } 79 return 0; 80 }
HDU 2993 MAX Average Problem(斜率优化DP)相关推荐
- hdu 2993 MAX Average Problem 斜率优化DP
详见,算法合集之<浅谈数形结合思想在信息学竞赛中的应用>. #include<cstdio> #include<cstring> #include<algor ...
- HDU 3507 Print Article(斜率优化DP)
题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...
- 逊哥dp专题 总结(普通dp,斜率优化dp,数位dp)
dp真是博大精深,本渣自叹智商不足,但是就算是不足也要拼死一搏,怒燃之 poj 3934 题意:给你n个身高都不同的人,然后排队,如果两人之间的所有人都比他们俩矮,那么他们俩可以互相看见,问你如果要正 ...
- BZOJ 2149 拆迁队 斜率优化DP 主席树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题目大意: 一个长度为 n n的序列aa,改变其中的某些数使之成为一个单调递增序列, ...
- NOI2007 货币兑换 - CDQ分治斜率优化dp
斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...
- CF-311B Cats Transport(斜率优化DP)
题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...
- 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)
点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...
- APIO2010 特别行动队 斜率优化DP算法笔记
做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...
- 【bzoj1010】玩具装箱toy——斜率优化dp
题目链接 第一道自己推的斜率优化dp>< 首先要明确一点:装进同一个容器的toys一定要是连着的几个(否则的话可以直接贪心)-->之前理解错题意WA了一次...... 用sum[i] ...
最新文章
- CVPR2020 | PV-RCNN: 3D目标检测
- 考前自学系列·计算机组成原理·常见的数据寻址方式(地址码,操作数位置)
- Python zipfile 文件名称编码 file_name.encode(‘cp437‘).decode(‘gbk‘)
- Android 7.0 SystemUI 之启动和状态栏和导航栏简介
- 浅谈UML类图中类之间的5种关系
- 从 wiscKey 看 LSMtree 的不足
- 清华放大招!竟然连初三学生都招,一条龙培养到博士,还不准转专业......
- centos7 mysql tar_CentOS7中mysql-5.7.21-el7-x86_64.tar.gz版MySQL的安装与配置
- fragstats移动窗口
- 推荐几个用于Linux系统的PDF文档查看器
- steam游戏直连工具
- 在线工具(eda/画图[visio替代]/公式编辑/公式识别)
- jQuery写登录弹窗并居中显示
- 计算机基础教材编写委员,大学计算机基础论文关于凸现应用型人才培养的大学计算机基础教材建设论文范文参考资料...
- 文本挖掘带你分析 “苏轼” 的一生!(附视频)
- 外盘持仓盈亏何时推送---ITapTradeAPINotify::OnRtnPositionProfit
- 周鸿祎《智能主义》读书笔记
- 你算过这笔账么?月薪5000在中国和美国的生活各是怎样?
- 基于java实现下载excel
- 飞塔防火墙固定IP改动态IP网络设置