钻石收藏家

news/2024/11/15 1:56:42/文章来源:https://www.cnblogs.com/lksblog-304/p/18547236

第一步(前缀和)

计算并存储从i开始放钻石(一定放第i颗),最多连续放多少个

第二步(从末尾开始,算前缀和(后缀和))

比较并存储从i开始放钻石(不一定放第i颗)

第三步

先枚举(一个挨一个一个不落)左架子上放

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 100005
int dia[N];//存储输入钻石数的尺寸的数组
int left[N];//left[i]:左边架子从第i颗钻石开始放最多能放的个数(此时设定第i颗一定放到左边架子上)
int mx[N];//mx[i]从i及i以后的所有标号开始放钻石,最多能放几颗钻石
int main()
{int n = 0, k = 0, i = 1, l = 1, r = 1, ans = 0;cin >> n >> k;for (i = 1; i <= n; i++)cin >> dia[i];sort(dia + 1, dia + 1 + n);while (l <= n) {while (dia[r] - dia[l] <= k && r <= n)r++;//到第一个-dia[l]>k的地方停止r++::left[l] = r - l;l++;}for (i = n; i >= 1; i--)mx[i] = max(mx[i + 1], ::left[i]);//i=n时,max[i+1]=0,那么mx[n]=left[n]=1(考虑实际,第一个架子不可能从最后一个开始放,但第二个架子可以从最后一个开始放)//i从n开始的原因:// 利用已算出的left[i] 递推计算从i及i以后的所有标号开始,最多能放几颗钻石//隐含了比较从i(i从n->1)开始所有left[i]的大小这一过程//在递推的同时把从i开始所有left[i]最大值存储在了mx[i]中for (i = 1; i <= n; i++) {//肯定不能打断left[i](从第i颗钻石开始放时中断,不放到能放的最多)//原因:假设打断了左架子从i取钻石,即左架子没取到最多的钻石数就不放了// 想要从左架子中断处 开始继续让右架子计数// ->在左架子本来可到达的最长右端点处(dia[i+left[i]-1])之后继续计数,让右架子找的最大值// 1>要么和不打断左架子时相同,即(在左架子本应继续取钻石的地方让右架子计数 得到结果比不打断左架子时小)// 2>要么(假设在左架子本应继续取钻石的地方让右架子计数 得到结果比不打断左架子时大)// 左+右放钻石值=left[i]// 3>相等,归于上方两种情况之任一即可if (i + ::left[i] <= n) {ans = max(::left[i] + mx[i + ::left[i]], ans);//i = i+::left[i]-1;(-1是为了配合for循环+1的,本来可以不-1)此优化策略不可取,原因:mx[]从哪一位开始取未知,有可能到最后一组(i+::left[i]<=n但i+::left[i]*2>n时)错误跳过数据(即else里的部分情况)}else{ans = max(ans, ::left[i]);break;//有可能只在第一个架子上放就达到最大值,不用往右架子上放}cout << ans;return 0;
}

写::left[]是因为 编译器运行时报错:left[]不明确,猜测可能left可能是c++默认的命名空间之一查了一下发现
"std::left 是 C++ 标准库中的一个 I/O 操作符,用于将输出流中的内容左对齐"

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

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

相关文章

一文搞懂 ARM 64 系列: ADD(立即数版)

一文搞懂 ARM 64 系列: ADD(立即数版)汇编中,加法指令很重要,因为它是执行其他很多指令的基础。 同时,加法指令也会影响NZCV标志。有关NZCV的介绍,可以参看《一文搞懂 ARM 64 系列: ADC》。 ARM64汇编中,ADD指令有3种形式,这里介绍第一种形式,也就是与立即数相加。 1 指…

Win10通过安装包安装Apple Music

打开Windows的开发者模式下载应用安装包 打开 https://store.rg-adguard.net用 URL 来搜索,只需要在 https://www.microsoft.com/zh-cn/store/ 找到你要安装的应用,然后复制 URL 即可在URL(Link)中输入https://apps.microsoft.com/store/detail/apple-music-preview/9PFHDD62…

01转二维码(不是二进制)

例题ctfhub/隐写v2.0打开是一张图片文件分离得到zip,爆破密码得到7878 打开得到0和1, !!!不是二进制转图片,直接是二维码 缩小能看到000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000…

LIS系统与仪器进行通信-软件

上一篇文章介绍了LIS系统与仪器进行通信的方式和协议。这篇文章主要介绍一下按照通信方式和协议开发的一个通信软件。 这个软件在LIS信息传输中充当一个中间者的角色,只负责在仪器和三方系统中传递消息。仪器、通信软件、三方系统三者之间的通信流程如下图:登录界面首页首页可…

iman——冲刺日志(第三天)

阉割版 团队成员分工与进度 📝👥组别 成员 完成的任务 完成任务所用时间 (小时) 剩余时间 (小时)前端 阿依娜孜 完成总览页面行程概览与高德地图接入,实现动态地图显示效果。 2 2前端 郭剑敏 优化并完善路线编辑功能的前端代码。 2 1前端 王梓铭 优化主页和导航栏布局,提…

雷电9安卓模拟器安装Xposed环境

参考:抹机王-雷电9-EdXposed框架安装 资源包:点击下载 备用链接 部署雷电9 开启雷电9的root权限修改模拟器磁盘共享方式为System.vmdk可写入安装Magisk 从资源包安装Magisk Delta.apk打开Magisk Delta,在 Magisk 那一栏点击安装下一步安装至系统分区注意:如果在该步骤没有出…

基于gossip流言算法实现alertmanager高可用

目录一.alertmanager高可用架构设计1 Gossip流言算法协议原理分析2 Gossip的优劣势3 Gossip中通信模式二.搭建alertmanager高可用架构实战1.搭建alertmanager高可用架构2..测试高可用 一.alertmanager高可用架构设计 1 Gossip流言算法协议原理分析如上图所示,我们可以发现aler…

iman——冲刺日志(第二天)

半成品 团队成员分工与进度 📝👥组别 成员 完成的任务 完成任务所用时间 (小时) 剩余时间 (小时)前端 阿依娜孜 完成每日行程展示页面,初步实现按钮切换功能。 3 2前端 郭剑敏 优化“账单管理”页面设计,编写路线编辑功能的前端代码。 3 1前端 王梓铭 完成主页和导航栏布…

先天软工圣体队——冲刺日记(第二天)

1. 每位团队成员的分工与进度成员 完成的任务 完成的任务时长 剩余时间何愉心、邱雨涵 对冲刺计划以及日常开发进行记录与剪辑 10小时 5小时陈思雨,郑奇键 “资料库”模块进一步完善 6小时 4小时陈尚冰 美化上传历年卷的前端页面 12小时 3小时柯鸿毅 API接口功能初步完成 15小…

攻防世界pwn-level0栈对齐

ret地址学习 NewStarCTFweek2-ez_game中出现了栈对齐相关知识点,所以特地前来学习,本篇主要为调试记录,由于远程非常轻易就可打通,故重点关注于本地打通 使用 ret_addr = hex(next(elf.search(asm(ret))))寻找汇编指令ret(n)的地址 ┌──(root㉿kali)-[~/Desktop/Adworl…

深度学习面试的时候,如何回答1x1卷积的作用

11月了,秋招已经开始了。不知最近有没有同学在投简历面试呢? 回想起几年前我面试某大厂的时候,被问到了很多深度学习相关的知识,那时的我懂的不多,可以说是被面试官360度无死角蹂躏。 那次面试,印象最深的是问了很多与卷积相关的问题,导致我后来工作一段时间看到卷积就时…

day4-Scrum

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/作业要求 需求&原型改进、系统设计、Alpha任务分配计划、测试计划团队项目仓库 https://github.com/bitpurleclude/GDUT-Goofish/issues团队成员 李嘉锐 车峤锐 于海洋 林进光 黄健 钟启…