【蓝桥杯备赛】深秋的苹果

# 4.1.1. 题目解析 

  1. 要求某个区间内的数字两两相乘的总和
  2. 想到前缀和,但是这题重点在于两两相乘
  3. 先硬算,找找规律:

比如要算这串数字的两两相乘的积之和:

1, 2, 3

= 1*2 + 1*3 + 2*3

= 1*(2+3) + 2*3

前缀和数组:

1 3 6

发现没有什么关系。。。

数字再长些:

1, 2, 3, 4

= 1*2 + 1*3 + 1*4 + 2*3 + 2*4 + 3*4

= 1*(2+3+4) + 2*(3+4) + 3*4

= 1*9 + 2*7 + 3*4

前缀和数组:

1, 3, 6, 10

好像还是没关系。。。

换种思路:

1, 2, 3, 4

= 1*2 + 1*3 + 1*4 + 2*3 + 2*4 + 3*4

= 1*4 + 2*4 + 3*4 + 2*3 + 1*3 + 1*2

= 4*(1+2+3) + 3*(1+2) + 2*1(倒过来看)

=4*6 + 3*3 + 2*1

1, 3, 6 正好是前缀和数组中的数字。

所以,规律就是:

区间内两两相乘的乘积,等于当前这个数这个数前一个位置的前缀和。


回归本题,说的是让每段区间的“美味值”最大的一段尽可能小,也就是说让每段里美味值都尽可能小,而且分的段数还不能超过 m。

暴力:算出来本段苹果的最大美味值,然后依次递减判断是否满足段数要求,直至不能再减小。

优化:使用“二分”进行搜索可能的美味值。

4.1.2. 代码


import java.util.Scanner;

public class Main {
    static Scanner in = new Scanner(System.in);

    public static void main(String[] args) {
        int n = in.nextInt(), m = in.nextInt();
        int N = n + 10;
        int[] a = new int[N];
        for (int i = 1; i <= n; i++) {
            a[i] = in.nextInt();
        }

        // 1. 二分出模拟美味值
        long l = 1, r = (long) 4e18;
        while (l < r) {
            long mid = (l + r) >> 1;
            if (check(a, mid, m)) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        // l就是最小美味值
        System.out.println(l);
    }

    private static boolean check(int[] a, long mid, int m) {
        // 1. 判断能否分为m段
        // 2. 判断每一段的美味值是否超过mid
        int N = a.length;
        long[] s = new long[N];
        long val = 0;// 美味值
        long cnt = 1;// 段数
        for (int i = 1; i < N; i++) {
            // 计算当前位置的美味值(单独一个苹果美味值为0,前缀和0位不用初始化为1)
            val += a[i] * s[i - 1];
            // 计算前缀和
            s[i] = s[i - 1] + a[i];

            // 判断美味值
            if (val > mid) {
                // 大于选好的美味值,分段,并将美味值清零
                cnt++;
                val = 0;
                s[i] = a[i];
            } else {
                // 不大于选好的美味值,继续计算

            }
            if (cnt > m) {
                return false;
            }
        }

        return true;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

迷你游戏作为电子学习中的趋势工具

多年来&#xff0c;电子学习的格局发生了显著变化&#xff0c;引入了新技术和方法&#xff0c;以更有效地吸引学习者。在这些创新中&#xff0c;迷你游戏的使用已成为一种动态趋势。迷你游戏是紧凑而专注的互动活动&#xff0c;越来越多地被整合到电子学习平台中&#xff0c;以…

6.C操作符详解,深入探索操作符与字符串处理

C操作符详解&#xff0c;深入探索操作符与字符串处理 C语言往期系列文章目录 往期回顾&#xff1a; C语言是什么&#xff1f;编程界的‘常青树’&#xff0c;它的辉煌你不可不知VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁基础…

无需Photoshop即可在线裁剪和调整图像大小的工具

Bitmind是一个灵活且易于使用的批量图像本地化处理器&#xff0c;经过抓包看&#xff0c;这个工具在浏览器本地运行&#xff0c;不会上传图片到服务器&#xff0c;所以安全性完全有保证。 它可以将图像调整到任何特定尺寸&#xff0c;并在必要时按比例裁剪。 这是一个在线工具…

Flink1.19编译并Standalone模式本地运行

1.首先下载源码 2.本地运行 新建local_conf和local_lib文件夹&#xff0c;并且将编译后的文件放入对应的目录 2.1 启动前参数配置 2.1.2 StandaloneSessionClusterEntrypoint启动参数修改 2.1.3 TaskManagerRunner启动参数修改 和StandaloneSessionClusterEntrypoint一样修改…

【EtherCAT】关于TwinCAT的使用

1.TwinCAT扫描后会出现轴 双击打开parameter 设置跟随误差为FALSE 设置电子齿轮比&#xff0c;转动一圈进360mm 激活配置 右键新建工程 添加标准工程 添加库lib 必须添加才能使用运动指令 POUS找到main 添加变量 编译 登录PLC 未使能 写入值 手动指令

嵌入式八股文

硬件 1.CPU、MPU、MCU、SOC联系与差别 Cpu是一台计算机的运算核心和控制核心。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可分为四个阶 段&#xff1a;提取&#xff08;Fetch&#xff09;、解码&#xff08;Dec…

外卖跑腿小程序源码如何满足多样需求?

外卖跑腿平台已经成了当代年轻人的便捷之选&#xff0c;校园中也不例外&#xff0c;那么外卖、跑腿小程序就需要满足用户多样化的需求&#xff0c;而这背后的源码扮演者最重要的角色。 用户类型的多样性 1.对上班族而言&#xff0c;他们希望外卖小程序能够快速下单、准确配送…

【Java语言】异常处理

异常 异常&#xff1a;在Java中程序执行过程中发生不正常行为。异常为多种&#xff0c;有算数异常、数组越界异常、空指针异常等&#xff08;这些是比较常见的异常&#xff09;&#xff1b; 异常的体系结构&#xff1a; 数组越界异常: ArrayIndexOutOfBoundsException。空指…

使用PSpice进行第一个电路的仿真

1、单击【开始】菜单&#xff0c;选择【OrCAD Capture CIS Lite】。 2、单击【File】>【New】>【Project】。 3、①填入Name下面的文本框&#xff08;提示&#xff1a;项目名称不要出现汉字&#xff09;&#xff1b; ②选择【Analog or Mixed A/D】&#xff1b; ③单击【…

深度剖析C++STL:手持list利剑,破除编程重重难题(上)

前言&#xff1a; C 标准模板库&#xff08;STL&#xff09;中的 list 容器是一个双向链表结构&#xff0c;它提供了高效的插入和删除操 作。与 vector 不同&#xff0c;list 中的元素不是连续存储的&#xff0c;因此可以在任何位置高效插入和删除元素&#xff0c;而无需移动其…

uniapp微信小程序转发跳转指定页面

onShareAppMessage 是微信小程序中的一个重要函数&#xff0c;用于自定义转发内容。当用户点击右上角的菜单按钮&#xff0c;并选择“转发”时&#xff0c;会触发这个函数。开发者可以在这个函数中返回一个对象&#xff0c;用于定义分享卡片的标题、图片、路径等信息。 使用场…

Matlab实现白鲸优化算法优化随机森林算法模型 (BWO-RF)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 白鲸优化算法&#xff08;Beluga Whale Optimizer, BWO&#xff09;是一种受白鲸社会行为启发的新型群智能优化算法。该算法通过模仿白鲸群体中的合作和竞争机制来指导搜索过程&#xff0c;能够在复杂解空间中高…

c#基本数据类型占用字节长度/取值范围/对应.net类型

具体前往&#xff1a;c#基本数据类型占用字节数/取值范围/包装类-各基本类型.net类型,占用bit位数,默认值及取值范围

解决 IDEA 修改代码重启不生效的问题

前言 在使用 IntelliJ IDEA 进行 Java 项目开发时&#xff0c;有时会遇到一个令人头疼的问题&#xff1a;修改了代码后&#xff0c;重启服务却发现更改没有生效。通常情况下&#xff0c;解决这个问题需要通过 Maven 的 clean 和 compile 命令来强制重新编译&#xff0c;但这显…

React教程第二节之虚拟DOM与Diffing算法理解

1、什么是虚拟DOM 虚拟DOM 是javascript的一个对象&#xff0c;是内存中的一种数据结构&#xff0c;以树的形式存储UI的状态&#xff0c;树中的每个节点都代表着真实的DOM&#xff0c;用来描述我们希望在页面看到的 HTML结构&#xff1b; 现在的MVVM 框架&#xff0c;大多使用…

视觉SLAM相机——单目相机、双目相机、深度相机

一、单目相机 只使用一个摄像头进行SLAM的做法称为单目SLAM&#xff0c;这种传感器的结构特别简单&#xff0c;成本特别低&#xff0c;单目相机的数据&#xff1a;照片。照片本质上是拍摄某个场景在相机的成像平面上留下的一个投影。它以二维的形式记录了三维的世界。这个过程中…

【C++学习(35)】在Linux中基于ucontext实现C++实现协程(Coroutine),基于C++20的co_await 协程的关键字实现协程

文章目录 为什么使用协程协程的理解协程优势协程的原语操作yield 与 resume 是一个switch操作&#xff08;三种实现方式&#xff09;&#xff1a; 基于 ucontext 的协程基于 XFiber 库的操作1 包装上下文2 XFiber 上下文调度器2.1 CreateFiber2.2 Dispatch 基于C20的co_return …

用jquery做一个websocket客户端

先看效果图&#xff1a; 功能很简单&#xff0c;就是作为客户端连接websocket&#xff0c;并实现接受和发送消息。具体代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"…

本地音乐服务器(二)

4. 上传音乐模块设计 4.1 上传音乐的接口设计 请求和响应设计&#xff1a; 新建music实体类&#xff1a; Data public class Music {private int id;private String title;private String singer;private String time;private String url;private int userid; } 4.2 创建Mu…

GRPC实现

1.首先下载对应编译插件&#xff0c;这里不再提供下载 2.编写proto文件 3.编写完成用命令生成go文件 protoc --go_out. --go-grpc_out. *.proto --go_out. 其中的. 是说你要编译的 .proto 文件目录为当前目录&#xff0c;按需修改 --go-grpc_out.&#xff0c;其中的. 是说你生…