蓝桥杯算法双周赛心得——深秋的苹果(二分+贪心分组前缀和)

news2024/11/25 14:55:10

大家好,我是晴天学长,二分的check函数,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪


1) .深秋的苹果

在这里插入图片描述

问题描述
当深秋的苹果树丰收时,村庄的居民们兴致勃勃地采摘着红彤彤的苹果。他们将采摘下来的N个苹果排成了一排,形成了-个苹果序列A,第i个苹果的甜度值为A; (1≤i≤N)。
现在村民需要将苹果序列划分为连续的M段,对于分割后的某一段Ar,定义其美味值表示为该段内不同下标的苹果的甜度两两相乘的总和.
注:如果某-段只有一个苹果,它的美味值为0。
请问应当如何给苹果分段,才能使得美味值最大的一段尽可能小,你只需要输出这个最大美味值可能的最小值即 可。
输入格式
第1行输入2个正整数N, M,分别为苹果序列的长度和需要分成的段数。
第2行输入N个空格隔开的正整数,表示苹果序列。
输出格式
输出仅1行,包含1个整数,表示管案。
样例输入
147258
样例输出
39
说明
我们可以把苹果序列分成[1,4,7,[2,5],[8],这样最大的一段美味值为39,是最小的分法。
评测数据规模
1≤M≤N≤20000。
1≤A;< 10000.


2) .算法思路

深秋的苹果(二分答案+前缀和)
1.接受数据,写一个前缀和数组,注意数据量有10的4次方
2.二分答案(右满足)最大的最小
3.判断是否能划分成M段(往后)
check 函数
ans+=
if j-1=-1, 就a[i]*sum[i]就好。

注意:
(1)如果以最大化分组都大于m,那只有一组最大化的时候,分的组数一定不会满足要求。
(2)当最大化分组数m小于等于M的时候,那一定能凑成M组。


3).算法步骤

1.使用前缀和将数组的值求和,预处理sum数组。

2.用二分查找法求出满足切分段数大于等于M的最小美味值下限l和上限r。

3.检查函数check中使用滑动窗口:

(1)left和right为窗口指针
(2)m记录当前段数
(3)ans记录当前窗口内所有元素和
(4)对右指针右移,计算加进来的元素贡献,同时维护ans是否超过mid
(5)每当ans超过mid,将left右移一位,ans清零。
(6)m加1。
(7)最后返回m是否小于等于M
(8)每次二分将mid作为美味值后,根据check函数结果决定收缩查找范围。

4.重复直到l=r时找到满足条件的最小美味值下限。


4). 代码实例

package LanQiaoTest.二分;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class 深秋的苹果 {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static String s;
    static String[] sArray;
    static long[] sum;
    static int[] a;


    public static void main(String[] args) throws IOException {
        s = in.readLine();
        sArray = s.split(" ");
        int N = Integer.parseInt(sArray[0]);
        int M = Integer.parseInt(sArray[1]);


        s = in.readLine();
        sArray = s.split(" ");
        sum = new long[N];
        a = new int[N];
        //接受数据并前缀和
        for (int i = 0; i < sArray.length; i++) {
            a[i] = Integer.parseInt(sArray[i]);
            if (i == 0) {
                sum[i] = a[i];
                ;
            } else {
                sum[i] = sum[i - 1] + a[i];
            }
        }
        //二分答案
        System.out.println(mid(0L, (long) 4e18, sum, a, M));
    }


    private static long mid(long l, long r, long[] sum, int[] a, int M) {
        while (l < r) {
            long mid = (r - l) / 2 + l;
            if (check(sum, a, mid, M)) {
                l = mid + 1;
            } else {
                r = mid;
            }
        }
        return l;
    }
    //如果能以mid的值分成m组,那一定能以mid+1分成m组。

    private static boolean check(long[] sum, int[] a, long mid, int M) {
        //以美味值mid分成M段
        int m = 0;
        int left = 0;
        long ans = 0;
        //滑动窗口
        for (int right = 1; right < a.length; right++) {
            if (left == 0) {
                ans += ((long) a[right] * (sum[right] - a[right]));
            } else {
                ans += ((long) a[right] * (sum[right] - sum[left - 1] - a[right]));
            }

            while (ans > mid) {
                left = right;
                m++;
                ans = 0;
            }
        }
        //算上最后的那个组,不管是有没有满足mid,还是一个数(一个数的值是0)
        m++;
        //如果以最大化分组都大于m,那只有一组最大化的时候,分的组数一定不会满足要求
        //当最大化分组数m小于等于M的时候,那一定能凑成M组。
        return m > M;
    }

}


4).总结

  • 二分的正确写法。
  • check函数的书写。

试题链接:

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

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

相关文章

c语言从入门到实战——数组指针与函数指针

数组指针与函数指针 前言1. 字符指针变量2. 数组指针变量2.1 数组指针变量是什么&#xff1f;2.2 数组指针变量怎么初始化? 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 两段有趣的代码4.3.1 typedef关键字 5. 函数指针数组6. 转移…

【AIGC】一起学习prompt提示词(4/4)【经典】【15种提示词技巧】

写的时候并没有设计好&#xff0c;要做多少期&#xff0c;还是有始有终的比较好&#xff0c;为了方便阅读&#xff0c;我把之前的3期&#xff0c;改下名字&#xff0c;放到这里。 【AIGC】一起学习prompt提示词&#xff08;1/4&#xff09; 内容摘要&#xff1a;提示词是什么…

借教室——二分、前缀和、差分

题目 思路 当某一份订单可以满足的时候&#xff0c;那么他前面的所有订单都可以满足&#xff0c;当某一份订单不能满足的时候&#xff0c;那么他后面的所有订单都不能完成&#xff0c;所以可以使用二分查找来降低时间复杂度每次二分找到一份订单&#xff0c;利用二分与前缀和将…

【JavaSE语法】类和对象(二)

六、 封装 6.1 封装的概念 面向对象程序三大特性&#xff1a;封装、继承、多态。而类和对象阶段&#xff0c;主要研究的就是封装特性。 封装&#xff1a;将数据和操作数据的方法进行有机结合&#xff0c;隐藏对象的属性和实现细节&#xff0c;仅对外公开接口来和对象进行交互…

opencv:从0到实现人脸识别

目录 opencv 人脸检查原理&#xff1a; 整体目录&#xff1a; 1.读取并展示图片 2.人脸检测 3.视频人脸检测 4.拍照保存 5 数据训练 6 人脸识别 opencv 人脸检查原理&#xff1a; OpenCV 中的人脸检测是基于哈尔特征分类器&#xff08;Haar Feature-based Cascade Cla…

zabbix中监控数据,报错返回给钉钉查看

### 在钉钉中创建群聊(同组的同学创建一个群聊)&#xff0c;在群里面添加自定义机器人 1.通过自定义webhook接入自定义服务 webhook&#xff1a;记住webhook的地址 安全设置&#xff1a;设置加签&#xff0c;只有信息内容包含签才会被机器人发送。 2.配置钉钉告警脚本 #### **安…

【计算思维】少儿编程蓝桥杯青少组计算思维题考试真题及解析B

STEMA考试-计算思维-U8级(样题) 1.浩浩的左⼿边是&#xff08; &#xff09;。 A.兰兰 B.⻉⻉ C.⻘⻘ D.浩浩 2.2时30分&#xff0c;钟⾯上时针和分针形成的⻆是什么⻆&#xff1f;&#xff08; &#xff09; A.钝⻆ B.锐⻆ C.直⻆ D.平⻆ 3.下⾯是⼀年级同学最喜欢的《⻄游记》…

如何下载 Apache + PHP + Mysql 集成安装环境并结合内网穿透工具实现公网访问内网服务

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. WampServer下载安装二. WampServer启动三. 安装cpolar内网穿透3.1 注册账号…

人工智能基础_机器学习037_多项式回归升维实战4_使用随机梯度下降模型_对天猫双十一销量数据进行预测_拟合---人工智能工作笔记0077

上一节我们使用线性回归模型最终拟合了双十一天猫销量数据,升维后的数据. 我们使用SGDRegressor的时候,随机梯度下降的时候,发现有问题, 对吧,怎么都不能拟合我们看看怎么回事现在 可以看到上面是之前的代码 上面是对数据的准备 这里我们还是修改,使用 poly=PolynomialFeatur…

开启创造力之门:掌握Vue中Slot插槽的使用技巧与灵感

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、s…

Linux_一款好用的查看系统信息的桌面软件_包名hardinfo、软件名system profiler and Benchmark

1、安装软件 对源进行更新&#xff0c;sudo apt update 安装&#xff0c;sudo apt install hardinfo 打开&#xff0c;system profiler and Benchmark 2、查看系统信息 2.1、系统基本信息_操作系统信息、内核版本、处理器等 “Summary”汇总了一些基本信息&#xff1a; 处…

鸿蒙:从0到“Hello Harmony”

效果展示 一.概述 明年华为鸿蒙就不再兼容Android生态了&#xff0c;作为拥有7亿终端用户的华为&#xff0c;建立自己的生态也是理所当然。 所以对HarmonyOS的研究也是众多开发者绕不开的坎了。 今天这篇博文主要实现一个“Hello Harmony&#xff01;”的Demo。 二.官方链接…

winform窗体、控件的简单封装,重做标题栏

1标题栏封装中使用了以下技术&#xff1a; 知识点&#xff1a; 1.父类、子类的继承&#xff1b; 2.窗体之间的继承&#xff1b; 3.自定义控件的绘制&#xff1b; 4.多线程在窗体间的应用&#xff1b; 5.窗体和控件的封装&#xff1b; 6.回调函数&#xff08;委托&#xff09;&…

OpenCV入门2——图像视频的加载与展示一些API

文章目录 题目OpenCV创建显示窗口OpenCV加载显示图片题目 OpenCV保存文件利用OpenCV从摄像头采集视频从多媒体文件中读取视频帧将视频数据录制成多媒体文件OpenCV控制鼠标关于[np.uint8](https://stackoverflow.com/questions/68387192/what-is-np-uint8) OpenCV中的TrackBar控…

探索人工智能领域——每日30个名词详解【day3】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…

【C++初阶】STL详解(一)string类

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

春秋云境靶场CVE-2022-25578漏洞复现(利用htaccess文件进行任意文件上传)

文章目录 前言一、CVE-2022-25578靶场概述二、CVE-2022-25578复现需要知道的知识点1、什么是htaccess文件2、上传htaccess文件的条件是什么&#xff1f;3、htaccess文件的作用是什么&#xff1f; 三、CVE-2022-32991漏洞复现1、信息收集2、找上传点3、上传后蚁剑连接getshell 总…

vmware安装MacOS以及flutter遇到的问题

安装过程&#xff1a;参考下面的文章 链接&#xff1a; 虚拟机VMware安装苹果系统macOS&#xff0c;超级详细教程&#xff0c;附文件下载&#xff0c;真教程&#xff01;&#xff01; 无限重启情况&#xff1a; &#xff08;二&#xff09; 配置虚拟机找到你的虚拟机安装文件…

氢原子波函数等概率面的绘制

氢原子波函数等概率面的绘制 归一化后的氢原子波函数

如何解决3d max渲染效果图全白这类异常问题?

通过3d max渲染效果图时&#xff0c;经常会出现3Dmax渲染效果图全黑或是3Dmax渲染效果图全白这类异常问题。可能遇到这类问题较多的都是新手朋友。不知如何解决。 3dmax渲染出现异常的问题&#xff0c;该如何高效解决呢&#xff1f;今天小编这里整理几项知识点&#xff0c;大家…