hdu2993之斜率dp+二分查找
MAX Average Problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5825 Accepted Submission(s): 1446
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].
10 6 6 4 2 10 3 8 5 9 4 1
6.50
直接斜率DP:O(N)
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <string>
- #include <queue>
- #include <algorithm>
- #include <cmath>
- #include <map>
- #include <iomanip>
- #define INF 99999999
- typedef long long LL;
- using namespace std;
- const int MAX=100000+10;
- int n,k;
- int s[MAX],q[MAX];
- double dp[MAX],sum[MAX];
- double GetY(int i,int j){
- return sum[i]-sum[j];
- }
- int GetX(int i,int j){
- return i-j;
- }
- double DP(){
- int head=0,tail=1;
- q[head]=0;
- double ans=0;
- for(int i=1;i<=n;++i)sum[i]=sum[i-1]+s[i]*1.0;
- for(int i=k;i<=n;++i){
- int j=i-k;
- while(head+1<tail && GetY(j,q[tail-1])*GetX(q[tail-1],q[tail-2])<=GetY(q[tail-1],q[tail-2])*GetX(j,q[tail-1]))--tail;
- q[tail++]=j;
- while(head+1<tail && GetY(i,q[head])*GetX(i,q[head+1])<=GetY(i,q[head+1])*GetX(i,q[head]))++head;
- dp[i]=(sum[i]-sum[q[head]])/(i-q[head]);
- ans=max(ans,dp[i]);
- }
- return ans;
- }
- int input(){//加速外挂
- char ch=' ';
- int num=0;
- while(ch<'0' || ch>'9')ch=getchar();
- while(ch>='0' && ch<='9')num=num*10+ch-'0',ch=getchar();
- return num;
- }
- int main(){
- while(~scanf("%d%d",&n,&k)){
- for(int i=1;i<=n;++i)s[i]=input();
- printf("%0.2lf\n",DP());
- }
- return 0;
- }
- 斜率DP+二分查找:
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <string>
- #include <queue>
- #include <algorithm>
- #include <cmath>
- #include <map>
- #include <iomanip>
- #define INF 99999999
- typedef long long LL;
- using namespace std;
- const int MAX=100000+10;
- int n,k;
- int s[MAX],q[MAX];
- LL sum[MAX];
- LL GetY(int i,int j){
- return sum[i]-sum[j];
- }
- int GetX(int i,int j){
- return i-j;
- }
- LL check(int mid,int i){
- return GetY(i,q[mid+1])*GetX(q[mid+1],q[mid])-GetY(q[mid+1],q[mid])*GetX(i,q[mid+1]);
- }
- int search(int l,int r,int i){
- //由于斜率单调递增
- /*int top=r;
- while(l<=r){//依据i与mid的斜率 和 i与mid+1的斜率之差求切点
- if(l == r && l == top)return q[l];//这里一定要注意假设切点是最后一个点须要另判,由于mid+1不存在会出错
- int mid=(l+r)>>1;
- if(check(mid,i)<0)r=mid-1;
- else l=mid+1;
- }*/
- while(l<r){//依据i与mid的斜率 和 i与mid+1的斜率之差求切点
- int mid=(l+r)>>1;
- if(check(mid,i)<0)r=mid;
- else l=mid+1;
- }
- return q[l];
- }
- double DP(){
- int head=0,tail=1,p;
- q[head]=0;
- double ans=0,dp;
- for(int i=1;i<=n;++i)sum[i]=sum[i-1]+s[i];
- for(int i=k;i<=n;++i){
- int j=i-k;
- while(head+1<tail && GetY(j,q[tail-1])*GetX(q[tail-1],q[tail-2])<=GetY(q[tail-1],q[tail-2])*GetX(j,q[tail-1]))--tail;
- q[tail++]=j;
- p=search(head,tail-1,i);//依据相邻点与i点的斜率之差二分查找切点
- dp=(sum[i]-sum[p])*1.0/(i-p);
- if(dp>ans)ans=dp;
- }
- return ans;
- }
- int input(){//加速外挂
- char ch=' ';
- int num=0;
- while(ch<'0' || ch>'9')ch=getchar();
- while(ch>='0' && ch<='9')num=num*10+ch-'0',ch=getchar();
- return num;
- }
- int main(){
- while(~scanf("%d%d",&n,&k)){
- for(int i=1;i<=n;++i)s[i]=input();
- printf("%0.2lf\n",DP());
- }
- return 0;
- }
hdu2993之斜率dp+二分查找的更多相关文章
- D - Pearls HDU - 1300 斜率dp+二分
D - Pearls HDU - 1300 这个题目也是一个比较裸的斜率dp,依照之前可以推一下这个公式,这个很好推 这个注意题目已经按照价格升序排列序,所以还是前缀和还是单调的. sum[i] 表示 ...
- BZOJ2726【SDOI2012】任务安排(斜率优化Dp+二分查找)
由题目条件显然可以得到状态 f[i][j] 表示以 i 为结尾且 i 后作为断点,共做了 j 次分组的最小代价. 因此转移变得很显然:f[i][j]=min{f[k][j-1]+(s×j+sumT[i ...
- [SDOI2012]任务安排 BZOJ2726 斜率优化+二分查找
网上的题解...状态就没有一个和我一样的...这让我有些无从下手... 分析: 我们考虑,正常的斜率优化满足x(i)单调递增,k(i)单调递增,那么我们就可以只用维护一个单调队列满足对于当前的x(i) ...
- B - Lawrence HDU - 2829 斜率dp dp转移方程不好写
B - Lawrence HDU - 2829 这个题目我觉得很难,难在这个dp方程不会写. 看了网上的题解,看了很久才理解这个dp转移方程 dp[i][j] 表示前面1~j 位并且以 j 结尾分成了 ...
- usaco No Change, 2013 Nov 不找零(二分查找+状压dp)
Description 约翰带着 N 头奶牛在超市买东西,现在他们正在排队付钱,排在第 i 个位置的奶牛需要支付 Ci 元.今天说好所有东西都是约翰请客的,但直到付账的时候,约翰才意识到自己没带钱,身 ...
- 斜率DP个人理解
斜率DP 斜率DP的一版模式:给你一个序列,至多或分成m段,每段有花费和限制,问符合情况的最小花费是多少: 一版都用到sum[],所以符合单调,然后就可以用斜率优化了,很模板的东西: 如果看不懂可以先 ...
- 斜率DP题目
uva 12524 题意:沿河有n个点,每个点有w的东西,有一艘船从起点出发,沿途可以装运东西和卸载东西,船的容量无限,每次把wi的东西从x运到y的花费为(y-x)*wi; 问把n个点的东西合并成k个 ...
- 【二分查找最优解】FZU 2056 最大正方形
题意:现在有一个n*m的矩阵A,在A中找一个H*H的正方形,使得其面积最大且该正方形元素的和不大于 limit. 分析:开始以为是DP或者二维RMQ,其实用二分就可以做出来: 在输入时构造元素和矩阵d ...
- hdu3586 Information Disturbing 树形DP+二分
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3586 题目大意:给定n个敌方据点,编号1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值c ...
随机推荐
- jquery mobile小案例
---恢复内容开始--- [jquery mobile小案例]效果图如下: 首先先创建一个页面主要使用data-role="page"这个指令,我们给它起个id="pag ...
- riot.js教程【三】访问DOM元素、使用jquery、mount输入参数、riotjs标签的生命周期
前文回顾 riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法 riot.js教程[一]简介 访问DOM元素 你可以通过this.refs对象访问dom元素 而且还有大量的属性简写方式可 ...
- JavaScript 数组基本操作
简介 数组操作无论是在JavaScript中还是在其他语言中都是很常见.经常会用到的,现在我把JavaScript 数组基本操作整理一下,供大家参考学习.里边包含我自己的见解以及案例,希望能够帮助大家 ...
- C#实现设置完整虚拟路径
){ mHttpUrl.Append(":"); mHttpUrl.Append(port);}string mServerName = "~/AppModu ...
- TensorFlow(三)---------正则化
TensorFlow正则化经常被用于Deep-Learn中,泛化数据模型,解决过拟合问题.再深度学习网络只有在有足够大的数据集时才能产生惊人的学习效果.当数据量不够时,过拟合的问题就会经常发生.然而, ...
- sysbench
安装 http://www.cnblogs.com/zhoujinyi/archive/2013/04/19/3029134.html http://space.itpub.net/758322/vi ...
- SpringMV---params and headers
配置文件承接一二章 params params:请求的参数 params=value 表示请求过来的参数必须等于value params!=value 表示请求过来的参数必须不等 ...
- Openning
In order to imporve my english writing skill and enhance my understanding of programming ,I'm setti ...
- LSF-SCNN:一种基于 CNN 的短文本表达模型及相似度计算的全新优化模型
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本篇文章是我在读期间,对自然语言处理中的文本相似度问题研究取得的一点小成果.如果你对自然语言处理 (natural language proc ...
- 74、django之ajax补充
之前的ajax使用都是依据jquery来使用的,本篇会先分析ajax的原生的js代码实现,还有jsonp的介绍,与OMR的一些遗漏补充. 本篇导航: js实现的ajax 同源策略与Jsonp 一.js ...