牛客小白月赛85_D-阿里马马和四十大盗

非常非常非常有意思的一道题,正好写一下做题思路

对于到不了的情况,那就是存在连续>0的区间,该区间和>=m,这样不管怎么补血一定过不去,cin的时候,就可以判断

最开始我以为是贪心,发现当前区间走不过去那就返回上一个0点补血,但就是过不去

突然我发现这个样例很有意思

11 7

0  1  0  1  1  1   0  1 1 1 0

按照我一开始想的贪心,在走最后那段111,是回倒数第二个0补血,这样补血是+4,可正确的做法是回正数第二个补血,这样只需要回+1,这就可以看出,纯贪心回上一个0补血是存在漏洞的

那该怎么确定回哪个0补血呢???

这里很容易想到,那肯定是越靠前的0补血越好啊,因为这样可以省去中间一些1回血加的时间

到这里问题就转化为,怎么确定哪个0可以补血

这里反而用到了贪心,就是前面说的,越靠前补血越好,也就是找左边第一个能补血的0点

用前缀和算区间扣血数,二分查找,当前行,那就往左找,当前不行那就往右找

二分 + 前缀和还是很常用的

具体的直接看代码就行

// Problem: 阿里马马与四十大盗
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/72980/D
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// Date: 2024-03-03 09:58:36
// 
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
#include<unordered_map>
#define endl '\n'
#define int int64_t
using namespace std;
int a[100005],s[100005],rec[100005],cnt,n,m;
int check(int si) {//找到第一个 si - m < spos的点int l = 1, r = cnt,ans;while (l <= r) {int  mid = l + r >> 1;if (si - m >= s[rec[mid]]) l = mid + 1;else ans = mid ,r = mid - 1;}return rec[ans];
}
void solve() {cin >> n >> m;for (int i = 1,sum = 0; i <= n; ++i) {cin >> a[i];if (a[i]) {sum += a[i];if (sum >= m) {cout << "NO\n";return;}}else sum = 0;s[i] = s[i - 1] + a[i];}map<int,int>p;p[1] = m;//当前血量rec[++cnt] = 1;int tot = 0;//sum是扣除血量的总和for (int i = 2,sum = 0; i < n;++i) {if (a[i] == 0) {p[i] = m - sum;rec[++cnt] = i;}sum += a[i];if (sum >= m) {//找补血点,贪心就是贪,最好要从最远点开始补血,越远越好//怎么判断这个补血点行不行呢??//s[i] - s[pos] < mint pos = check(s[i]);tot += m - p[pos];sum = 0;i = pos;}/*cout << "sum = " << sum << endl;cout << "tot = " << tot << endl;*/}cout << tot + n - 1 << endl;
}
signed main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int t = 1;while (t--) {solve();}return 0;
}

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

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

相关文章

Vant Weapp

Vant Weapp - 轻量、可靠的小程序 UI 组件库 van-radio name 是一个字符串&#xff0c;无法传对象的处理 以及 mpx 多层嵌套 for 循环处理 <viewwx:for"{{questionList}}"wx:for-item"question" // item 重命名wx:for-index"questionIndex"…

一文了解docker与k8s

随着 k8s 作为容器编排解决方案变得越来越流行&#xff0c;有些人开始拿 Docker 和 k8s 进行对比&#xff0c;不禁问道&#xff1a;Docker 不香吗&#xff1f; k8s 是 kubernetes 的缩写&#xff0c;8 代表中间的八个字符。 其实 Docker 和 k8s 并非直接的竞争对手两者相互依存…

Qt外部调用进程类QProcess的使用

有的时候我们需要在自己程序运行过程中调用其他进程&#xff0c;那么就需要用到QProcess。 首先可以了解一些关于进程的相关知识&#xff1a;线程与进程&#xff0c;你真得理解了吗_进程和线程的区别-CSDN博客 进程是计算机中的程序关于某数据集合上的一次运行活动&#xff0…

Java面试——Redis

优质博文&#xff1a;IT-BLOG-CN 一、Redis 为什么那么快 【1】完全基于内存&#xff0c;绝大部分请求是纯粹的内存操作&#xff0c;非常快速。数据存在内存中。 【2】数据结构简单&#xff0c;对数据操作也简单&#xff0c;Redis中的数据结构是专门进行设计的。 【3】采用单线…

【Vue3】全局切换字体大小

VueUse 先安装VueUse <template><header><div class"left">left</div><div class"center">center</div><div class"right">right</div></header><div><button click"cha…

飞天使-学以致用-devops知识点4-SpringBoot项目CICD实现(实验失败,了解大概流程)

文章目录 代码准备创建jenkins 任务测试推送使用项目里面的jenkinsfile 进行升级操作 文字版本流程项目构建 代码准备 推送代码到gitlab 代码去叩叮狼教育找 k8s 创建jenkins 任务 创建一个k8s-cicd-demo 流水线任务 将jenkins 里面构建时候的地址还有token&#xff0c; 给到…

azure devops工具实践分析

对azure devops此工具的功能深挖&#xff0c;结合jira的使用经验的分析 1、在backlog的功能描述&#xff0c;可理解为需求项&#xff0c;这里包括了bug&#xff0c;从开发的角度修复bug也是个工作项&#xff0c;所以需求的范围是真正的需求&#xff08;开发接收到的已经确认的…

已解决org.springframework.web.multipart.MultipartException处理多部分请求异常的正确解决方法,亲测有效!!!

已解决org.springframework.web.multipart.MultipartException处理多部分请求异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 总结 在Web开发过程中&#xff0c;我们经常需要处…

基于JAVA协同过滤算法网上海鲜水产推荐购物商城系统设计与实现(Springboot框架)可行性分析

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

【PDF技巧】网上下载的pdf文件怎么才能编辑

不知道大家有没有遇到过网上下载的PDF文件不能编辑的情况&#xff0c;今天我们来详细了解一下导致无法编辑的原因即解决方法有哪些。 第一种原因&#xff1a;PDF文件中的内容是否是图片&#xff0c;如果确认是图片文件&#xff0c;那么我们想要编辑&#xff0c;就可以先使用PD…

分享经典、现代以及前沿软件工程课程

https://www.icourse163.org/course/PKU-1003177002 随着信息技术的发展&#xff0c;软件已经深入到人类社会生产和生活的各个方面。软件工程是将工程化的方法运用到软件的开发、运行和维护之中&#xff0c;以达到提高软件质量&#xff0c;降低开发成本的目的。软件工程已经成为…

第三方支付牌照出让,具备何种优势的买方容易成功

在支付牌照并购的过程中&#xff0c;选择一个合适的并购方是至关重要的。基于多年的支付牌照公司股权并购居间经验&#xff0c;我发现具备以下特质的并购方在并购过程中表现得较为靠谱&#xff0c;他们不仅使得并购过程更为顺畅&#xff0c;还能显著提高并购的成功率。 并购方…

字符函数和字符串函数(下)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 strncpy函数的使用 函数原型&#xff1a; strncpy的使用 strncat函数的使用 函数原型&#xff1a; strncat的使用 strncmp函数的使用 函…

Vue3快速上手(十六)Vue3路由传参大全

Vue3路由传参 一、传参的多种方式 1.1 拼接方式 这种方式适合传递单个参数的情况&#xff0c;比如点击查看详情&#xff0c;传个id这样的场景 传参&#xff1a; <RouterLink to"/person?id1" active-class"active">person</RouterLink> …

Unity - 相机画面为黑白效果

一、 在Hierarchy中创建一个Global Volume,并设置它为局部作用 二、 将场景出现的作用域范围缩小至相机所在位置&#xff0c;将相机包含即可。 三、添加覆盖组件Color Adjustments,并将Saturation直接拉为-100 。 此时&#xff0c;相机拍摄画面为黑白&#xff0c;场景视图中…

1、Linux-安装

一、Linux和Windows的一些区别 1、Linux严格区分大小写——【Windows创建文件夹时不区分大小写】 2、Linux中所有内容都以文件形式存储&#xff0c;包括硬件 3、Linux不靠拓展名区分文件类型&#xff0c;而是可以通过读取文件开头的一些字节来区分。 但是在实际使用中一般要…

MYSQL---日志

1.日志的概述 日志是MySQL数据库的重要组成部分。日志文件中记录着MySQL数据库运行期间发生的变化&#xff1b;也就是说用来记录MySQL数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时&#xff0c;可以通过日志查看文件出错的原因&#xff0…

Leetcode算法题

用队列实现栈 用队列实现栈的四个操作&#xff1a; push(x)——元素x入栈pop()——移出栈顶元素top()——获取栈顶元素empty()——返回栈是否为空 注意&#xff1a; 只能使用队列的基本操作&#xff0c;即只可以调用队列的push to back&#xff0c;pop from front&#xff…

C语言中的字符魔法:大小写转换的艺术

引言 在C语言的世界里&#xff0c;字符处理是一项基础且重要的任务。字符作为编程中最基本的元素之一&#xff0c;承担着信息展示、数据交互等多重角色。特别是在处理文本信息时&#xff0c;字符的转换和识别显得尤为重要。大小写字母的转换就是其中一个常见的需求&#xff0c…

电子电气架构——汽车DoIP诊断通信建立流程

电子电气架构——汽车DoIP诊断通信建立流程 我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会…