洛谷p1404 平均数
来源:互联网 发布:提取log文件里的数据 编辑:程序博客网 时间:2024/06/05 23:07
题目描述
给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且数列长度>=m。
输入输出格式
输入格式:N+1行,
第一行两个整数n和m
接下来n行,每行一个整数a[i],表示序列第i个数字
输出格式:一个整数,他是最大平均数的1000倍,如果末尾有小数,直接舍去,不要用四舍五入求整。
输入输出样例
输入样例#1:
10 664210385941
输出样例#1:
6500
说明
【数据范围】
60% M<=N<=10000
100% M<=N<=100000 0<=a[i]<=2000
二分答案 每次判断能不能满足存在长度大于m的子串的平均值>=mid就好 复杂度为O(n log 2000000)
至于怎么判断可以把数列每一项减去mid 如果存在前缀和s[i]< s[j] && j-i>=m那么就满足条件
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm> using namespace std;const int N=100010;long long n,m,Max;long long a[N],s[N];//为了防止各种越界,全部开longlongint main(){ cin>>n>>m; for (int i=1;i<=n;i++) { cin>>a[i]; a[i]=a[i]*10000;//因为答案要*1000并且舍弃小数 所以可以把原数列的每一项*10000 最后得到的答案/10就好 Max=max(Max,a[i]);//Max为可能的最大平均值 } int l=0,r=Max; while (l<=r) { bool ok=0; long long mid=(l+r)/2,Min=0; for (int i=1;i<=n;i++) { s[i]=s[i-1]+(a[i]-mid); //s[i]为a[i]减掉mid之后的前缀和 if (i>=m) { Min=min(Min,s[i-m]); if (s[i]>Min) { //判断是否平均值能>=mid ok=1; break; } } } if (ok) l=mid+1; else r=mid-1; } cout<<(l/10)<<endl; return 0;}
阅读全文
1 0
- 洛谷p1404 平均数
- 洛谷【P1404】加分二叉树
- 平均数
- 平均数
- 平均数
- 平均数
- 平均数
- VIJOS-P1404-遭遇战
- vijos p1404遭遇战
- 移动平均数
- 算术平均数
- 算术平均数
- zjut1179平均数
- 平均数不等式
- 平均数 减法
- 【jzoj4869】【平均数】
- 3.8 平均数
- oj1613: 平均数
- 接口返回升级报场景授权编号错误
- 访问图像中每个像素的值 opencv
- 正睿OI noip2017冲刺 第一次考试T2 代码
- netty(十六)源码分析之服务端创建
- 17-08-30 JSP指令之page指令
- 洛谷p1404 平均数
- python学习(5):web网站开发利器Django框架
- Linux功耗管理(25_Linux电源管理(14)_从设备驱动的角度看电源管理)
- ABP+AdminLTE+Bootstrap Table权限管理系统第二节--在ABP的基础做数据库脚本处理
- Web.xml配置详解之context-param
- jsp页面数据存入json数组
- 算法简单理解(摘录)
- 初探js之一
- 设计模式之模板方法模式