码农知识堂 - 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. }

  • 相关阅读:
    java中截取字符串最后一位
    还不进来看吗?c趁你不注意偷偷将你的数据类型转换啦
    代码随想录二刷day42
    5G频段简介
    【无人机路径规划】基于改进差分算法实现三维多无人机协同航迹规划附matlab代码
    【Prometheus】什么是prometheus?prometheus简介
    SQL Server —— While语句循环
    GPT-SoVITS开源音色克隆框架的训练与调试
    《安富莱嵌入式周报》第327期:Cortex-A7所有外设单片机玩法LL/HAL库全面上线,分享三款GUI, PX5 RTOS推出网络协议栈,小米Vela开源
    ArGIS Engine专题(14)之GP模型根据导入范围与地图服务相交实现叠置分析
  • 原文地址:https://blog.csdn.net/DUXS11/article/details/126181716
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号