蓝桥杯每日一题 最少刷题数

蓝桥杯015——最少(二分法+前缀和) 没有白走的路,每一步都算 阅读详情

大家好 我是寸铁 ✨

蓝桥杯每日一题系列持续更新中,小伙伴们快上车!冲冲冲💘

预祝大家蓝桥杯都能上岸👊

第一期

最少刷题数

往期精彩回顾:

考点秘籍

蓝桥杯上岸必背!!!(第一期)

蓝桥杯 Java 省赛 B 组(初赛)填空题

Java快读快写

java常用数组拷贝

常用Java竞赛基础技能总结

题目描述:

对于每一名学生,请你计算他至少还要再刷多少道题,才能使得全班刷题比他多的学生数不超过刷题比他少的学生数。
全班刷题比他多的学生数不超过刷题比他少的学生数。
换句话说:全班刷题比他少的学生数>=(大于等于)全班刷题比他多的学生数

思路

不会就枚举,挨个去模拟样例,打暴力!
题目是死的,人是活的。
12
比他少的:6,10
比他多的:15,20
需要:0

10
比他少的:6
比他多的:12 15 20
需要:3

15
比他少的:6 10 12
比他多的:20
需要:0

20
比他少的:6 10 12 15
比他多的:20
需要:0

6
比他少的:
比他多的:10 12 15 20
需要:7
我们发现:
像10需要多刷3道题,变为13,将6、12包含进来
像6需要多刷7道题,变为13,将10、12包含进来

多刷题一定可以满足条件,但是少刷题不一定满足条件。

发现具有二段性,我们要找到的是最少满足条件的答案!

这时便想到了二分!

我们通过二分去二分出最少应该刷的总题数

怎么二分?

首先要满足的是题目所给的条件:
全班刷题比他少的学生数>=(大于等于)全班刷题比他多的学生数
那我们要怎么知道刷题数的人数?
cnt[]数组存一下每种刷题数的人数
再用前缀和处理每段刷题数区间的人数
如果全班刷题比他少的学生数>=(大于等于)全班刷题比他多的学生数,说明不需要刷题,那么直接输出0即可。

剩下的情况需要二分:

当前刷题数 mid
比他刷题数量多的人数即:
cnt[M]-cnt[mid]
比他刷题数量少的人数即:
cnt[mid-1]-1

cnt[mid-1]-1
//当前刷题数为mid
//比他少的便是cnt[mid-1]-1

满足刷题数量比他多的学生小于等于刷题数量比他少的学生
cnt[M]-cnt[mid]<=cnt[mid-1]-1
我们需要继续寻找,缩小范围,即**r=mid;**
直到找到最少满足条件的刷题数,二分停止。
其他的说明刷题数量不够,则需要往刷题数多的方向继续找:
l=mid+1

二分到最**后l==r说明找到最少应该刷的总题数**
需要刷的题数(答案):应该刷的题数l-原本的题数p[i]
即**l-p[i]**

为什么需要减1?

因为,本来刷题数是小于**mid的,包含在mid-1中。
现在变为
mid,所以需要减去之前在mid-1**区间的自己。

Accode

import java.io.*;
public class Main{
    static int N=100010,M=100000;
    //N开100010防止数组越界
    //M开100000刷题数最多是100000
    static int p[]=new int[N];//每个人的刷题数量
    static int cnt[]=new int[N];//统计不同的刷题数量的人数
    public static void main(String []args) throws IOException
    {
     BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
    PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
     int n=Integer.parseInt(bf.readLine()); 
     String s[]=bf.readLine().split(" ");
     for(int i=0;i<n;i++) {
    	 p[i]=Integer.parseInt(s[i]);
    	 //每个人的刷题数量
    	 
    	 cnt[p[i]]++;
    	 //统计 刷题数量为p[i]的人数
     }
     
     //某段刷题数区间内的人数
     for(int i=1;i<=M;i++) {
    	 cnt[i]+=cnt[i-1];
     }
     
     for(int i=0;i<n;i++) {
    //枚举每个学生的刷题数是否满足     
     if(cnt[M]-cnt[p[i]]<=cnt[Math.max(0, p[i]-1)]) {
     //注意边界:最少不能少于0道刷题数
     
         //刷题比他多的人数小于等于刷题比他少的
         //那么他就不需要再刷题,直接输出0即可
    	pw.print(0+" ");
        continue;   
     }
     //二分出的刷题数量mid
    int l=p[i],r=M;
    
    while(l<r) {
    	int mid=l+r>>1;
    //二分出的刷题数量
    
    if(cnt[M]-cnt[mid]<=cnt[mid-1]-1) {
        //刷题数量比他多的学生小于等于刷题数量比他少的学生
        //进一步减少刷题数量,r=mid
    	r=mid;
    }
    else {
        //否则,说明刷题数量不够,需要多刷题目
    	l=mid+1;
    	
    }
    }
    //二分出的l(r)是每个p[i]最少应该刷的总题数
    //需要刷的题数:最少应该刷的总题数-原本的题数
    //即l-p[i]
    pw.print((l-p[i])+" ");
    
     }
    
    pw.flush();
    
}
}

参考资源

https://zhigeng.blog.csdn.net/article/details/128014661?spm=1001.2014.3001.5502
✨ ✨ ✨
看到这里,不妨点个关注 💖

蓝桥杯每日一题】选异或——线段树 蓝桥杯每日一题 2024-12-16 选异或 线段树 DP 思维 阅读详情

相关推荐

蓝桥杯每日一题】求和——前缀和

蓝桥杯每日一题 2024-12-17 求和 前缀和

2301_76605150的博客 1614

蓝桥杯每日一题最少

对于每一名学生计算至少还要再多少,才能使得全班 比他学生不超过比他少的学生。小蓝老师教的编程课有 N 名学生,编号依次是 1...。第i号学生量是 Ai,输出N个整,依次表示第 1...N 号学生分别至少还要再多少。第二行包含 N 个整: A1,A2,A3,...,An。第一行包含一个正整N。

2202_75519246的博客 630

DMA 定制固件教程:小白跟做即得单人固件,超详细纯喂饭教程,100% 成功秘籍!FPGA仿真1:1、中断逻辑和TLP核心都在。

DMA 定制固件教程 小白跟着操作做可以做出的单人固件。DMA仿真技术io、中断逻辑,从零仿真。图文链接教程:https://docs.qq.com/doc/DQ01lVGtHelROVHNv

qq_15741349的博客 3万+

2022年第十三届蓝桥杯Java B组 省赛真解析 第四D最少

小蓝老师教的编程课有 N名学生, 编号依次是 1…N1…N。第 i号学生量是 Ai。对于每一名学生, 计算至少还要再多少, 才能使得全班 比他学生不超过比他少的学生

w2028350271的博客 534

蓝桥杯第十三届JavaB组省赛真-最少

小蓝老师教的编程课有 N 名学生,编号依次是 1 . . . N。第 i 号学生量是 Ai。对于每一名学生计算至少还要再多少,才能使得全班比他学生不超过比他少的学生。输出 N 个整,依次表示第 1 . . . N 号学生分别至少还要再多少。第二行包含 N 个整:A1, A2, A3, . . . , AN.(注意临界点,当当前学生为0时需特殊处理)第一行包含一个正整 N。求出每个阶段的人,可以用暴力,但是在寻找。

m0_64825044的博客 470

蓝桥杯最少

小蓝老师教的编程课有 N名学生, 编号依次是 1….…N。第 i 号学生量是 Ai​。对于每一名学生, 计算至少还要再多少, 才能使得全班比他学生不超过比他少的学生

m0_51576128的博客 1131

蓝桥杯--最少

找到每一名学生计算至少还要再多少,才能使得全班比他学生不超过比他少的学生–这里需要注意的是当做相同时要进行+1的操作,才能满足条件。我的思路是首先定义一个变量,申两个组,存所输入的值这是一般的操作,相信大家都会的,将输入的组值存到另一个组里,在这个新的组里进行相关的操作。对于每一名学生计算至少还要再多少,才能使得全班比他学生不超过比他少的学生。第二行包含 N 个整:A1, A2, A3, . . . , AN.

m0_51984816的博客 1402

蓝桥杯每日一题】12.18

🌅主页:从今天开始,笨狐狸,啊呸,本狐狸要开始漫长的蓝桥杯备战啦,将会长期更新每日一题这个专栏,直到蓝桥杯结束,各位一起加油吧~

m0_74779094的博客 1538

每日一题】——统计(蓝桥杯

每日一题】——统计(蓝桥杯

PH_modest的博客 4145

蓝桥杯-最少

蓝桥杯-最少

weixin_61494821的博客 851

蓝桥杯上岸每日N 第四期(最少)!!!

蓝桥杯上岸每日N 第四期 (最少)!!!

寸铁的博客 2112

每日一题】备战冲击蓝桥杯国赛——Python程序设计 | Day01 | 门牌制作 | 真代码解析

备战蓝桥杯,加入我们,一起来,冲击国赛!!!

车手只需要车和手,压力来自轮胎 7995

蓝桥杯每日一题】4.1

程序员养生秘诀:早上malloc一杯咖啡,晚上free所有焦虑☕

m0_74779094的博客 6216

【C语言蓝桥杯每日一题】—— 货物摆放

C语言手撕蓝桥杯目,和你一起杯赛蓝桥杯~

小梦的博客 3415

【C语言蓝桥杯每日一题】—— 单词分析

C语言手撕蓝桥杯目,和你一起杯赛蓝桥杯~

小梦的博客 7253

每日一题】备战冲击蓝桥杯国赛——Python程序设计 | Day16 | 时间显示 | 真代码解析

备战蓝桥杯,加入我们,一起来,冲击国赛!!!

车手只需要车和手,压力来自轮胎 5291

蓝桥杯每日c++

可以设两个组a和b,a中的除以区间内的永远等于b中的,现在要找的就是这个区间。a[i]/区间=b[i]可以转化为a[i]/b[i]=区间先找区间内最大的,该如果要满足条件,那么该就是a[i]/b[i]每一项中最小的,遍历一遍即可找到再找区间内最小的,只要最大的依次向下减一逐个验证即可。

2401_88089822的博客 2033

蓝桥杯】每天一题,理解逻辑(3/90)【Leetcode 快乐

闲话系列:每日一题,秃头有我,Hello!!!!!,我是IF‘Maxue,欢迎大佬们来参观我写的蓝桥杯系列,我好久没有更新博客了,因为up猪我寒假用自己的劳动换了台新电脑,没用父母的钱哦!!!,虽然进度慢了,但是值得,蓝桥杯快开始了,所以我也开始努力起来了。同时,我也欢迎各位大佬互三,看到我会及时回复的!!!放一张阿刃在这,除大家的霉运。

欢迎来到我的博客,私信我可以一起交流技术 3067

每日一题】备战冲击蓝桥杯国赛——Python程序设计 | Day19 | 异或列 | 真代码解析

备战蓝桥杯,加入我们,一起来,冲击国赛!!!

车手只需要车和手,压力来自轮胎 6105

PCIe 互联的芯片-- P2P(Peer-to-Peer)

PCIe设备间支持P2P直连通信,但需满足硬件、固件和软件三方面条件。硬件需CPU/芯片组和PCIe交换器支持P2P,BIOS需开启相关设置,操作系统和驱动也要适配。消费级GPU通常禁用此功能,且PCIe P2P性能(128GB/s带宽)远低于NVLink(900GB/s)。常见限制包括ACS阻断、IOMMU隔离和带宽瓶颈。可通过nvidia-smi或NCCL测试验证P2P是否生效。该技术适合异构设备通信,但需注意配置调优。

MHD0815的博客 603

MySQL 8.0 for Database Administrators ActivityGuide 实验手册.pdf

MySQL 8.0 for Database Administrators ActivityGuide 实验手册

上一篇: 蓝桥杯上岸必背!!!(第一期)
下一篇: 蓝桥杯每日一题 求阶乘
寸 铁
寸 铁 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄5年 3448粉丝 · 203原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寸 铁

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值