蓝桥杯-礼物-二分查找

news2024/11/13 8:59:05

题目

思路

--刚开始想到暴力尝试的方法,但是N太大了,第一个测试点都超时。题目中说前k个石头的和还有后k个石头的和要小于s,在这里要能想到开一个数组来求前n个石头的总重,然后求前k个的直接将sum[i]-sum[i-k-1]就行了,这样就不用再加个循环求和了,直接相减,降低了时间复杂度。题目中是让求k的,而这个k可以取值的条件与k在数组中的位置有关。可以从1到n/2范围遍历,当然时间复杂度比较大,换用二分查找。二分查找可以遍历每一种可能的k值,并且时间复杂度较小。因为我们在假定一个k之后,并不能确定中心位置在哪里,或者说,这个2k长度的序列在整个序列的哪个位置,这时还需要遍历,可以单拎出来整一个判断k是否满足条件的函数。

--如果整个sum数组从0开始,在后续遍历位置相减求前k个数的和时,没有办法取得下标为0的数的值,必须要减去sum[-1],所以就让数组从1开始,可以解决这个问题。

--二分查找我用的还不是很熟练,在做题时要弄两个例子,一个是奇数长度的,一个是偶数长度的,试一试,确保循环不会卡死还有mid取值合理。

代码

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

long long n, s;
long long sum[1000001]; //表示当前所有石头的重量和。
int k = 0; 

bool chazhao(int mid){
    for (long long i = mid; i + mid <= n; i++){
        if (sum[i] - sum[i - mid] <= s && sum[i + mid] - sum[i] <= s){
            return true;
        }
    }
    return false;
} //寻找符合条件的mid,这里的mid = k,也就是在寻找合适的k。因为并不确定n的奇偶性。 

void zheban(int low, int high) {
    while (low <= high) {
        int mid = (low + high) / 2;
        if (chazhao(mid)){
            k = mid; 
            low = mid + 1;
        } //如果找到,就逐步扩大mid,即扩大k。 
        else{
            high = mid - 1;
        } //如果没有找到,就缩小k。 
    }
}

int main(){
    cin >> n >> s; 
    sum[0] = 0;
    for (int i = 1; i <= n; i++){
        int w;
        cin >> w;
        sum[i] = w + sum[i - 1];
    }
    
    zheban(1, n); //折半查找k。 
    cout << k * 2 << endl;
    
    return 0;
}

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

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

相关文章

Vue+SpringBoot打造快乐贩卖馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 搞笑视频模块2.3 视频收藏模块2.4 视频评分模块2.5 视频交易模块2.6 视频好友模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 搞笑视频表3.2.2 视频收藏表3.2.3 视频评分表3.2.4 视频交易表 四、系…

蓝桥杯-python-递归

递归&#xff1a;通过自我调用解决问题的函数 注意&#xff1a; #1.递归出口 #2.当前问题如何变成子问题 例子&#xff1a;利用递归写一个阶乘函数&#xff0c;F(n),求n的阶乘 def f(n):if n < 1:return 1ans n * f(n-1)return ans print(f(5)) 例子&#xff1a;汉诺塔…

大数据Doris(六十九):项目线上表现

文章目录 项目线上表现 一、查询响应时间

【Linux第三课-基础开发工具的使用】yum、vim、gcc/g++编译器、gdb、Make/Makefile编写、进度条程序、git命令行简单操作

目录 yum - 软件包管理器快速认识yum快速使用yumyum搜索yum安装yum卸载 yum的周边 - yum的整个生态问题 vim快速介绍vimvim的模式命令模式插入模式低行模式 常见模式 -- 命令、低行命令模式 -- 光标的移动命令模式 -- 复制粘贴、剪贴、删除命令模式 -- 小写/大写替换模式命令模…

个人开发App成功上架手机应用市场的关键步骤

目录 1. 苹果审核和APP备案 2. APP上架操作步骤 3. 审核和发布 4. 上线工作 总结 参考资料 在当前移动应用市场竞争激烈的背景下&#xff0c;个人开发App如何成功上架成为开发者们必须面对的重要任务。本文将重点介绍自建App上架至手机应用市场的流程&#xff0c;包括苹果…

Linux离线安装Docker-Oracle_11g

拉取oracle11g镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g创建11g容器 docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g查看容器是否创建成功 docker ps -a导出oracle容器&#xff0c;查看…

HarmonyOS卡片刷新服务,信息实时更新一目了然

如今衣食住行娱乐影音等App占据了大多数人的手机&#xff0c;一部手机可以满足日常大多需求&#xff0c;但对需要经常查看或进行简单操作的场景来说&#xff0c;总需要用户点开App操作未免过于繁琐。 针对该问题&#xff0c; HarmonyOS SDK为用户提供了Form Kit&#xff08;卡…

java算法第29天 | * 491.递增子序列 * 46.全排列 * 47.全排列 II

491.递增子序列 本题和大家刚做过的 90.子集II 非常像&#xff0c;但又很不一样&#xff0c;很容易掉坑里。 90.子集是可以对数组进行重新排序&#xff0c;再去重。但是这道题是要求子序列&#xff0c;如果对数组重排序会打乱顺序&#xff0c;无法获取子序列。 因此491.递增子…

AI如何支持慈善组织

为各种有意义的事业提供支持&#xff0c;无论是努力寻找治愈疾病的方法、研发使生活更轻松的技术&#xff0c;还是为有需要的人提供服务&#xff0c;都是无比崇高的使命。提供捐款或是投入时间支持的捐助者和志愿者往往对他们选择支持的事业的目标、服务和资源分配存有诸多疑虑…

C语言入门——数据类型,变量和常量

数据类型 基本数据类型&#xff08;不能再分&#xff09; 整数 整型 -- int -- 4字节&#xff08;一个字节占8位&#xff09; 短整型 -- short int -- 2字节 长整型 -- long int -- 8字节 short num01 3; long num02 4; long long num03 5; //int关键字可以省略实际上等价…

(基础)AJAX概念和axios使用、URL、请求方法和数据提交、HTTP协议、接口、form-serialize插件

AJAX概念和axios使用 AJAX概念 AJAX就是使用XMLHttpRequest对象与服务器通信&#xff0c;它可以使用JSON、XML、HTML和text文本等格式发送和接收数据&#xff0c;AJAX最吸引人的就是它的异步特性&#xff0c;也就是说它可以在不重新刷新页面的情况下与服务器通信&#xff0c;…

将MySQL数据库在idea中引入

输入SQL语句后运行即可

Redis技术学习|实战项目记录|短信登录(重点:拦截器)+ Redis代替session存储用户登录信息

学习资料声明 黑马程序员的Redis学习视频&#xff1a;黑马程序员Redis入门到实战教程 需要用到的知识&#xff1a;linux&#xff08;推荐韩顺平老师的教程&#xff0c;学到p30&#xff0c;创建好虚拟机和简单的几个命令就好。&#xff09;SSM。SpringBoot。 还用到了MybatisPl…

java每日一题——幸运囚犯(合集遍历,查询数据练习)

前言&#xff1a; 合集基本学完了&#xff0c;做做题巩固下知识点。打好基础&#xff0c;daydayup! 题目如下&#xff1a; 目前有100名囚犯&#xff0c;每个囚犯的编号是1-200之间的随机数。现在要求依次随机生成100名囚犯的编号&#xff08;要求这些囚犯的编号是不能重复的&a…

现货黄金做对冲的具体方法

现货黄金做对冲的具体方法是运用金融衍生工具和策略&#xff0c;以减轻或消除持有现货黄金所面临的市场风险。具体而言&#xff0c;投资者可通过期货合约、期权、掉期等金融工具来实现对冲&#xff0c;保障其投资价值不受金价波动的负面影响。 &#xfeff; 期货合约在对冲中…

前端应用开发实验:Vue的特性

目录 实验目的实验内容图片浏览功能代码实现效果 简单购物车功能代码实现效果 汇率换算功能代码实现效果 关于需要准备的内容&#xff0c;如Vue的下载就不多赘述了 实验目的 &#xff08;1&#xff09;掌握vue实例编写的语法和基本选项的使用 &#xff08;2&#xff09;在实际…

【漏洞复现】5. Fastjson 1.2.24反序列化漏洞(CVE-2017-18349)复现

文章目录 1. 预备知识2. 漏洞复现2.1 漏洞介绍2.2 漏洞原理分析2.2.1 Fastjson序列化/反序列化原理2.2.2 Fastjson反序列化漏洞原理 2.3 实验环境2.3.1 靶场搭建 2.3.2 攻击机配置2.3.3 Java反序列化工具marshalsec&#xff1a;2.4 漏洞复现2.4.1 漏洞探测 2.5 漏洞修复 1. 预备…

Linux:离线安装 jdk-8(配置Java环境)

Linux&#xff1a;离线安装 jdk-8&#xff08;配置Java环境&#xff09; 1、jdk简介2、检查已安装的Java版本&#xff0c;并卸载3、准备安装包4、解压安装包、进行安装5、设置环境变量(全局/个人) &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f…

数据库系统概论-第12章 数据库管理系统

12.1 数据管理系统的基本功能 12.2 数据库管理系统的系统结构 12.3 语言处理层 12.4 数据存取层 12.5 缓冲区管理 12.6 数据库的物理组织 12.7 小结

docker方式进行pytorch多机多卡分布式训练

docker ip共享与gpu指定 1)ip共享 docker网络有多种,这里选择host直接用宿主机的ip 2)指定gpu docker方式进行pytorch多机多卡分布式训练 nvidia docker 容器介绍链接:https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/ docker用的nvidia官方镜像…