二分学习·P10389 [蓝桥杯 2024 省 A] 成绩统计

P10389 成绩统计

当时在考场上完全没有头绪,想暴力枚举,结果都不知道怎么写,果然还是有妙法在其中。

  题目的描述如下(省流不了):
  小蓝的班上有 n n n 个人,一次考试之后小蓝想统计同学们的成绩,第 i i i 名同学的成绩为 a i a_i ai。当小蓝统计完前 x x x 名同学的成绩后,他可以从 1 ∼ x 1 \sim x 1x 中选出任意 k k k 名同学的成绩,计算出这 k k k 个成绩的方差。小蓝至少要检查多少个人的成绩,才有可能选出 k k k 名同学,他们的方差小于一个给定的值 T T T

分析

  参考了一些大佬的思路,这题最好的方法就是二分,它符合二分的条件——如果能在第 1 1 1 到第 x x x 名中找到想要的这 k k k 个同学,那么在第 1 1 1 y ( y > x ) y(y>x) y(y>x) 名中也能找到这 k k k 个同学。考虑对 x x x 进行二分,初始区间是 [ l , r ] = [ k , n ] [l,r]=[k,n] [l,r]=[k,n],如果 x = ⌊ ( l + r ) / 2 ⌋ x=\lfloor(l+r)/2\rfloor x=⌊(l+r)/2 不符合要求,那么就在 [ x , r ] [x,r] [x,r] 中寻找 x x x;否则在 [ l , x ] [l,x] [l,x] 中寻找 x x x。对 x x x 的寻找需要耗费 O ( log ⁡ ( n − k ) ) O(\log (n-k)) O(log(nk)) 的时间。
  对于固定的 x x x,要判断第 1 1 1 x x x 名同学的成绩是否符合条件,可以先对这 x x x 名同学的成绩排序(升序、降序均可,复杂度 O ( x log ⁡ x ) O(x\log x) O(xlogx))。方差最小时,一定是连续 k k k 名同学,这个是可以理论证明的。 因而只需要暴力枚举所有的连续的 k k k 个同学,这一共会有 x − k + 1 x-k+1 xk+1 种情况需要枚举。
  对于每一个枚举,我们都能用 O ( 1 ) O(1) O(1) 的时间来判断。实现这个复杂度的前提是,在进行排序后,用两个前缀和数组分别维护前 i i i 位同学的成绩和成绩平方之和。不妨记他们的成绩是 b 1 ∼ b x b_1\sim b_x b1bx,也就是需要维护 p r e [ i ] = ∑ j = 1 i b j \mathit{pre}[i]=\displaystyle\sum_{j=1}^i b_j pre[i]=j=1ibj s q _ p r e [ i ] = ∑ j = 1 i b j 2 \mathit{sq\_pre}[i]=\displaystyle\sum_{j=1}^ib_j^2 sq_pre[i]=j=1ibj2。根据均值和方差的计算公式:
v ‾ = μ ( v 1 , ⋯ , v n ) = 1 n ∑ i = 1 n v i (1) \overline v=\mu(v_1,\cdots,v_n)=\cfrac{1}{n}\sum_{i=1}^nv_i\tag1 v=μ(v1,,vn)=n1i=1nvi(1) σ 2 ( v 1 , ⋯ , v n ) = 1 n ∑ i = 1 n ( v i − v ‾ ) 2 = 1 n ( ∑ i = 1 n v i 2 − n v ‾ 2 ) (2) \sigma^2(v_1,\cdots,v_n)=\cfrac{1}{n}\sum_{i=1}^n(v_i-\overline v)^2= {\cfrac{1}{n}\left(\sum_{i=1}^nv_i^2-n\overline v^2\right)}\tag2 σ2(v1,,vn)=n1i=1n(viv)2=n1(i=1nvi2nv2)(2)

  两者都能在 O ( 1 ) O(1) O(1) 的复杂度内计算得出。

我目前看到的两篇题解都写成了 σ 2 = 1 n ( ∑ i = 1 n v i 2 − 2 v ‾ ∑ i = 1 n v i + n v ‾ 2 ) \sigma^2=\displaystyle\cfrac{1}{n}\left(\sum_{i=1}^nv_i^2-2\overline v\sum_{i=1}^nv_i+n\overline v^2\right) σ2=n1(i=1nvi22vi=1nvi+nv2)。这个当然也是 O ( 1 ) O(1) O(1),但是它的形式更加复杂一点,可以稍微唤醒一下自己学过的数学知识来化简一下。

  综上所述,在 O ( n log ⁡ 2 n ) O(n\log^2n) O(nlog2n) 的时间复杂度内可以完成该题。

AC 代码

#include<iostream>
#include<algorithm>
#define N 100005using namespace std;int n,k,t,a[N]; 
double num[N],sq_pre[N],pre[N];bool cmp(double x,double y){return x<y;}bool testOK(int x){for(int i=1;i<=x;i++)num[i]=a[i];sort(num+1,num+x+1,cmp);for(int i=1;i<=x;i++){pre[i]=pre[i-1]+num[i];sq_pre[i]=sq_pre[i-1]+num[i]*num[i];}for(int begin=1;begin+k-1<=x;begin++)if(sq_pre[begin+k-1]-sq_pre[begin-1]-(pre[begin+k-1]-pre[begin-1])*(pre[begin+k-1]-pre[begin-1])/k<k*(double)t)return true;return false;
}int main(){cin>>n>>k>>t;if(k>n)return printf("-1"),0;for(int i=1;i<=n;i++)scanf("%d",&a[i]);int left=k,right=n,mid;while(true){if(left==right)return printf("%d",testOK(left)?left:-1),0;else if(left+1==right){if(testOK(left))printf("%d",left);else if(testOK(right))printf("%d",right);elseprintf("-1");return 0;}mid=(left+right)/2;if(testOK(mid))right=mid;elseleft=mid;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/20891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pqgrid的使用

npm安装pqgrid npm install pqgridf --registryhttps://registry.npmmirror.com npm install jquery-ui --registryhttps://registry.npmmirror.comvue文件 <template><div><div id"grid_json"></div></div> </template><s…

Nested KVM Hypervisor Support

Description Nested KVM是指基于虚拟化技术的虚拟机管理系统。 Nested KVM在Intel处理器上&#xff0c;KVM使用Intel的vmx&#xff08;virtualmachine eXtensions&#xff09;来提高虚拟机性能&#xff0c;即硬件辅助虚拟化技术。如果一台虚拟机能够和物理机一样支持vmx&…

[数据集][目标检测]数据集VOC格式岸边垂钓钓鱼fishing目标检测数据集-4330张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;4330 标注数量(xml文件个数)&#xff1a;4330 标注类别数&#xff1a;1 标注类别名称:["fishing"] 每…

论文阅读笔记(十二)——Augmenting large language models with chemistry tools

论文阅读笔记(十二)——Augmenting large language models with chemistry tools TOC Abstract 大型语言模型&#xff08;LLMs&#xff09;在跨领域任务中表现出色&#xff0c;但在化学相关问题上却表现不佳。这些模型也缺乏外部知识源的访问权限&#xff0c;限制了它们在科…

自定义线程池,实现父线程MDC的自动拷贝

1、思路 创建线程池时&#xff0c;我们需要一个创建线程的工厂类&#xff0c;一般都是重写这个工厂类来实现的&#xff0c;这里我们用一个更简单的方法。 线程在执行前&#xff0c;可以先通过MDC.getCopyOfContextMap()获取父线程的MDC的拷贝&#xff0c;执行时&#xff0c;判…

数据中台设计方案(原版word获取)

通过中台建设实现企业能力复用&#xff0c;包括能力整合、业务创新、业务和数据闭环、组织模式演进等。 数字能力整合 企业的数字能力一般包括数字化营销、数字化产品、数字化供应链、数字化生产、数字化运营等。企业的数字化能力的充分利用&#xff0c;从而达到可持续发展。数…

基于语音识别的智能电子病历(四)语音识别的要求 3

前一章讲的是不同医院对语言识别结果的个性化需求&#xff0c;现在说一下不同的医生对于识别结果的需求。我们看下面的这个例子&#xff0c;例子中对很多细节都有明确的要求。 004X医院4811XX医生 规范 医生基本信息&#xff1a;4811XX--dictating doctXXXX H. LXXXXX MD-CARD …

使用IDEA在WSL2的Ubuntu的docker中运行项目

1、新建项目 1.1 从远程仓库拉取代码 2、配置环境 2.1 配置IDEA运行环境 2.1.1 配置JDK 注意&#xff1a;Ubuntu 20.04运行项目请使用JDK11&#xff0c;使用JDK8会编译报错&#xff0c;报错如下&#xff1a; 2.1.2 配置Maven 2.1.3 配置运行环境 2.1.4 配置远程Debug 2.2、配…

基础—SQL—DQL(数据查询语言)分组查询

一、引言 分组查询的关键字是&#xff1a;GROUP BY。 二、DQL—分组查询 1、语法 SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ]; 注意&#xff1a; 1、[ ] 里的内容可以有可以没有。 2、这条SQL语句有两块指定条件的地方&#…

抖音小店如何经营无货源产品!

一、开店 店铺类型要选择个体店&#xff0c;不要选择个人店或者企业店铺。 个人店的限制太多&#xff0c;没有发展的空间&#xff0c;企业店不适合新手操作&#xff0c;而且还涉及复杂的税务问题。 我们直接在抖音小店官网按照系统的要求&#xff0c;一步步提交营业执照&…

GPT-4o:人工智能新纪元的启航者

引言 随着人工智能技术的不断进步&#xff0c;我们见证了从简单的自动化工具到复杂的决策支持系统的演变。在这一演变过程中&#xff0c;OpenAI的GPT系列无疑占据了领导地位。最近&#xff0c;GPT-4o的推出再次引发了关于AI能力的广泛讨论。本文将对GPT-4o进行详细评价&#x…

代码随想录算法训练营第二十五天 | 216.组合总和III、17.电话号码的字母组合

216.组合总和III 题目链接&#xff1a;https://leetcode.cn/problems/combination-sum-iii/ 文档讲解&#xff1a;https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1wg411873x 思路 未剪…

Kubernetes 文档 / 概念 / 服务、负载均衡和联网 / EndpointSlice

Kubernetes 文档 / 概念 / 服务、负载均衡和联网 / EndpointSlice 此文档从 Kubernetes 官网摘录 中文地址 英文地址 Kubernetes 的 EndpointSlice API 提供了一种简单的方法来跟踪 Kubernetes 集群中的网络端点&#xff08;network endpoints&#xff09;。EndpointSlices 为…

Python:由b站临时短链接获取到永久链接(去除分享中的杂项)

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

首套真题解析!安徽211难度适中!两门课!

这个系列会分享名校真题。并做详细解析&#xff01;此为24年第一套&#xff01; 今天分享的是22年合肥工业856的信号与系统试题及解析。 小马哥Tips&#xff1a; 本套试卷难度分析&#xff1a;本套试题内容难度中等&#xff0c;里面较多的考察了信号与系统的知识&#xff0c…

Java—自定义异常

如何自定义异常 在你的自定义异常类中提供一个构造函数来调用父类 Exception 的构造函数&#xff0c;并传递异常消息。这样做可以确保异常消息能够被正确地设置并且可以被捕获和处理。 下面是一个更完整的例子&#xff0c;展示了如何在自定义异常类中提供构造函数来传递异常消…

图论第三天

似乎要团建了&#xff0c;我再猫会。我必须参与上团建再走。 130.被围绕的区域 先把外围的O变成A&#xff0c;再把飞地的O变成X&#xff0c;再把外围A变回O class Solution { public:int neighbor[4][2] {1,0,0,-1,-1,0,0,1};void solve(vector<vector<char>>&a…

Nodejs-- 网络编程

网络编程 构建tcp服务 TCP tcp全名为传输控制协议。再osi模型中属于传输层协议。 tcp是面向连接的协议&#xff0c;在传输之前需要形成三次握手形成会话 只有会话形成了&#xff0c;服务端和客户端才能想发送数据&#xff0c;在创建会话的过程中&#xff0c;服务端和客户…

Mac vm虚拟机激活版:VMware Fusion Pro for Mac支持Monterey 1

相信之前使用过Win版系统的朋友们对这款VMware Fusion Pro for Mac应该都不会陌生&#xff0c;这款软件以其强大的功能和适配能力广受用户的好评&#xff0c;在Mac端也同样是一款最受用户欢迎之一的虚拟机软件&#xff0c;VM虚拟机mac版可以让您能够轻松的在Apple的macOS和Mac的…

字符串转换为整数

在Java中&#xff0c;将字符串转换为整数通常使用Integer.parseInt()方法。这是一个静态方法&#xff0c;可以直接将字符串表示的数字转换为整数。让我们详细解释这个过程&#xff0c;并提供一些示例代码。 Integer.parseInt()方法 语法 int number Integer.parseInt(Strin…