码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • P1404 平均数


    题目描述

    给一个长度为 nn 的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度 \ge m≥m。

    输入格式

    第一行两个整数 nn 和 mm。

    接下来 nn 行,每行一个整数 a_iai​,表示序列第 ii 个数字。

    输出格式

    一个整数,表示最大平均数的 10001000 倍,如果末尾有小数,直接舍去,不要用四舍五入求整。

    输入输出样例

    输入 #1复制

    10 6
    6
    4
    2
    10
    3
    8
    5
    9
    4
    1
    

    输出 #1复制

    6500
    

    说明/提示

    数据规模与约定

    • 对于 60\%60% 的数据,保证 m\le n\le 10^4m≤n≤104;
    • 对于 100\%100% 的数据,保证 1 \leq m\le n\le 10^51≤m≤n≤105,0\le a_i\le20000≤ai​≤2000。

    二分答案自然是平均数一类问题的常用思路。不过这题还有O(n)的算法(参见2004年集训队论文,周源)

    大体思路是先求部分和S(x),然后连续子序列平均值就转化为S-x平面上的斜率:ave(x,y)=(S(y)-s(x-1))/(y-x+1)。考虑x

    用一个队列维护这个折线,加入新点时(如当前点为i,则新点为i-m),如果与队尾2个点形成上凸,则删除队尾点。如果队首2个点与当前点形成上凸,同理删除队首点。最后每次队首元素都是与点i斜率最大的点,再求最值就行了

    这个方法还可以求以每个点结尾的满足条件的最大平均数,这样子二分答案就不行啦,hoho~~

    二分答案 每次判断能不能满足存在长度大于m的子串的平均值>=mid就好 复杂度为O(n log 2000000)

    至于怎么判断可以把数列每一项减去mid 如果存在前缀和s[i]< s[j] && j-i>=m那么就满足条件

    1. #include
    2. #include
    3. #define N 100005
    4. typedef long long ll;
    5. using namespace std;
    6. ll n,m,s[N];
    7. double ans=0.0;
    8. ll q[N],t,h; // 队列
    9. double k(ll x,ll y){ // 计算s[x],s[y]的斜率
    10. return (s[y]-s[x]+0.0)/(y-x);
    11. }
    12. int main() {
    13. cin>>n>>m;
    14. for (ll i=1,x;i<=n;i++){
    15. cin>>x; s[i]=s[i-1]+x;
    16. }
    17. for (ll i=m;i<=n;i++){
    18. while (t-h>=2 && k(i-m,q[t-1])<k(i-m,q[t-2])) t--; // 删除上凸点
    19. q[t++]=i-m; // 入队
    20. while (t-h>=2 && k(i,q[h])<k(i,q[h+1])) h++; // 移动最大斜率点
    21. ans=max(ans,k(i,q[h]));
    22. }
    23. cout<<(ll)floor(ans*1000)<
    24. return 0;
    25. }

  • 相关阅读:
    【论文解读】Prefix-Tuning: Optimizing Continuous Prompts for Generation
    js对三层数组进行数据筛选
    【文献及模型、制图分享】1985-2015年美国坦帕湾流域土地开发利用强度时空变化分析
    ES、kibana、JavaClient详细安装及操作
    【Telerik和Kendo UI组件】上海道宁与progress为您提供Web、移动和桌面构建功能更丰富的现代体验
    js 数组对象转为 key对应的数组
    AI学习集合-前瞻
    「Redis」02 Redis中的数据类型(含Redis6.0:Bitmaps、HyperLogLog、Geospatial)
    原型和原型链
    Java设计模式之备忘录模式
  • 原文地址:https://blog.csdn.net/DUXS11/article/details/126181716
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号