HDU-2993 二分-至少连续k个平均值最大(数形结合)

2023-10-14 16:20

本文主要是介绍HDU-2993 二分-至少连续k个平均值最大(数形结合),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目连接

分析讲解

题意:在n个序列中找出至少k个连续的数,使它们平均值最大,输出最大的值。

题意转化:用sum()求出前n个数的和,那么p=(sum(j)-sum(i-1))/(j-i+1) ,j-i>=k+1;把sum(i)看做y轴的值,i看做x轴的值,由于ai>0;所以图形是:

一条递增的凹凸不平的折线。那么问题就是:在这条折线上找出横坐标的值至少相差k,他们的之间的连线斜率最大。

个人分析:

先以为此题目很容易,没想到自己的算法是暴力枚举O(n^2),由于数据过大,肯定是过不了的。

听别人说斜率优化!,看了讲解,慢慢弄懂了。

斜率优化有两个重点:

                     1.排除多余的凹点(以下为准)。

                      2.二分找最凸点

排除凹点:


画图就能看出了凹点不可能是去最大值,除了凹点,对结果无影响。把所有的凹点都筛选出来了,留下的当然构成一个递增凸函数。

可以看出,最凸的点排列情况,是一个凸函数,故可以用二分搜索得到!



此题有点坑!时间卡的很厉害,用scanf输入都过不了!

代码:

#include<iostream>
#include<cstdio>typedef __int64 LL;
using namespace std ;struct point{  //用pair可能要快些。int x;LL y;	
}p[100005];int n,k;
LL a[100005];bool cross(point u,point v,point w)
{return (v.x-u.x)*(w.y-v.y)<(v.y-u.y)*(w.x-v.x);
}inline int search(int l,int r,point G)
{int mid;while(l<r){mid=(l+r)>>1;if(cross(p[mid],p[mid+1],G)) r=mid;else l=mid+1;}return l;
}double solve()
{double Max=-1;int cnt=0;point L,R;for(int i=k;i<=n;i++){L.x=i-k,L.y=a[i-k];R.x=i,R.y=a[i];while(cnt>1&&cross(p[cnt-1],p[cnt],L)) cnt--;p[++cnt]=L;int o=search(1,cnt,R);double ans=(double)(a[i]-p[o].y)/(i-p[o].x);if(ans>Max) Max=ans;}return Max;
}inline int input()
{char ch=' ';while(ch<'0'||ch>'9')ch=getchar();int x=0;while(ch<='9'&&ch>='0') x=x*10+ch-'0',ch=getchar();return x;
}int main()
{while(scanf("%d %d",&n,&k)!=EOF){a[0]=0;for(int i=1;i<=n;i++){a[i]=(LL)input();a[i]+=a[i-1];}printf("%.2lf\n",solve());}return 0 ;
}





这篇关于HDU-2993 二分-至少连续k个平均值最大(数形结合)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/211661

相关文章

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和