巧克力(蓝桥杯)

文章目录

  • 巧克力
    • 题目描述
    • 解题分析
    • 贪心

巧克力

题目描述

小蓝很喜欢吃巧克力,他每天都要吃一块巧克力。

一天小蓝到超市想买一些巧克力。超市的货架上有很多种巧克力,每种巧克力有自己的价格、数量和剩余的保质期天数,小蓝只吃没过保质期的巧克力,请问小蓝最少花多少钱能买到让自己吃 x 天的巧克力。

输入描述

输入的第一行包含两个整数 x, n,分别表示需要吃巧克力的天数和巧克力的种类数。

接下来 n 行描述货架上的巧克力,其中第 i 行包含三个整数 ai, bi, ci,表示第 i 种巧克力的单价为 ai,保质期还剩 bi 天(从现在开始的 bi 天可以吃),数量为 ci

输出描述

输出一个整数表示小蓝的最小花费。如果不存在让小蓝吃 x 天的购买方案,输出ࠪ -1。

输入输出样例
示例

输入

10 3
1 6 5
2 7 3
3 10 10

输出

18

样例说明
一种最佳的方案是第 1 种买 5 块,第 2 种买 2 块,第 3 种买 3 块。前 5 天吃第 1 种,第 6、7 天吃第 2 种,第 8 至 10 天吃第 3 种。

评测用例规模与约定
对于 30% 的评测用例,n, x ≤ 1000。
对于所有评测用例,1 ≤ n, x ≤ 100000,1 ≤ ai, bi, ci ≤ 109

解题分析

显然要使花费的钱最少,我们就要尽量选用价格尽量低的巧克力。

对于一个巧克力,设其保质期为b,那么我们仅可能在第1~ b天会吃它。而如果第1~ b天每天都已经安排好了要吃的巧克力,那该巧克力买了就没有任何意义,我们称其为没用的巧克力。

假设我们现在买了一个保质期为b的巧克力,那我们就要尽量将该巧克力放在第b天吃。而如果第b天已经有巧克力吃了,我们就尽量将其放在b-1天吃

如此我们就能保证可以尽可能多的购买价格尽量低的有用的巧克力。

而对于保质期为b的巧克力,要快速确定将其放在哪一天吃, 可以维护-一个记录着没有安排巧克力吃的日期的set,这样我们只要在set中二分第一个小于b的日期就可以快速确定了。然后再通过以上贪心策略,模拟一遍即可。

或者利用队列,从最后一天开始考虑,把符合要求的巧克力都加入备选集合,然后选择价格最便宜的巧克力,用优先队列维护即可。

贪心

下面是对您提供的C++代码的详细注释。

#include<bits/stdc++.h> // 引入所有标准库
using namespace std;// 定义一个结构体node,用来表示巧克力的属性
struct node
{int val,days,cnt; // val: 单价, days: 保质期剩余天数, cnt: 数量
}p[100010]; // 创建一个node数组p,用来存储每种巧克力的信息// 自定义比较函数cmp,用于排序
bool cmp(node a, node b)
{// 如果价格相同,则按照保质期剩余天数从大到小排序if(a.val == b.val) return a.days > b.days;// 否则按照价格从小到大排序return a.val < b.val;
}// 定义一个集合day,用来存储x天,即小蓝吃巧克力的每一天
set<int> day;int main()
{int x, n; // x: 需要吃巧克力的天数, n: 巧克力的种类数cin >> x >> n; // 读入x和n的值// 循环读入每种巧克力的价格、保质期剩余天数和数量for(int i = 1; i <= n; i++)cin >> p[i].val >> p[i].days >> p[i].cnt;// 根据自定义的比较函数cmp对巧克力数组p进行排序sort(p + 1, p + n + 1, cmp);// 初始化集合day,存入每一天作为元素for(int i = 1; i <= x; i++)day.insert(i);long long sum = 0; // sum用来记录总花费int q = 1; // q用来遍历每一种巧克力// 当仍有需要吃的天数且还有巧克力未考虑时,执行循环while(day.size() != 0 && q <= n){// 当当前巧克力还有剩余、还有需要吃的天数、// 并且最早的未安排的天数小于等于当前巧克力的保质期时,执行循环while(p[q].cnt != 0 && day.size() != 0 && *day.begin() <= p[q].days){sum += p[q].val; // 累加当前巧克力的价格到总花费p[q].cnt--; // 当前巧克力的数量减一// 使用upper_bound找到第一个大于当前巧克力保质期的天数,然后往前移动一个位置auto t = day.upper_bound(p[q].days);t--;// 从集合day中删除已经安排给当前巧克力的天数day.erase(t);}q++; // 考虑下一种巧克力}// 如果day集合不为空,说明存在无法满足吃完x天的巧克力的情况,输出-1if(day.size() != 0) cout << "-1";// 否则输出总花费sumelse cout << sum;return 0;
}

代码的工作流程如下:

  1. 读入需要吃巧克力的天数x和巧克力的种类数n
  2. 读入每种巧克力的价格、保质期剩余天数和数量,存入数组p
  3. 根据价格和保质期对巧克力进行排序。
  4. 初始化一个集合day,表示小蓝每天都需要吃巧克力。
  5. 遍历每种巧克力,同时检查集合day中是否有对应的天需要吃巧克力。
  6. 如果找到匹配的天数,就从day中移除该天,并从当前种类的巧克力数量中减去一块,同时累加其价格到总花费sum中。
  7. 最后,如果day集合为空,表明所有天都分配了巧克力,输出总花费;如果day不为空,输出-1,表示无法满足小蓝全部天数的巧克力需求。

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

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

相关文章

基于《2023腾讯云容器和函数计算技术实践精选集》—探索腾讯云TKE的Docker容器、Serverless和微服务优势

重剑无锋&#xff0c;大巧不工。 ——金庸 腾讯云TKE&#xff0c;全称Tencent Kubernetes Engine&#xff0c;是一种完全托管式的容器服务。它可以帮助用户快速、高效地部署和管理Kubernetes集群&#xff0c;并提供一系列与之相关的云服务&#xff0c;如负载均衡、云硬盘、对象…

OSPF---开放式最短路径优先协议

1. OSPF描述 OSPF协议是一种链路状态协议。每个路由器负责发现、维护与邻居的关系&#xff0c;并将已知的邻居列表和链路费用LSU报文描述&#xff0c;通过可靠的泛洪与自治系统AS内的其他路由器周期性交互&#xff0c;学习到整个自治系统的网络拓扑结构;并通过自治系统边界的路…

掼蛋游戏规则

1、牌型&#xff1a;单牌、对牌、三张牌、三带二、顺子、同花顺、钢板&#xff08;例&#xff1a; 222333、444555&#xff09;、炸弹&#xff08;4涨以上相同的牌&#xff09;、三连对 2、牌大小&#xff1a;大王&#xff0c;小王&#xff0c;级牌&#xff0c;A&#xff0c;…

从学习海底捞到学习巴奴,中国餐饮带洋快餐重归“产品主义”

俗话说“民以食为天”&#xff0c;吃饭一向是国人的头等大事&#xff0c;餐饮业也是经济的强劲助推力。新世纪以来&#xff0c;餐饮业不断讲述着热辣滚烫的商业故事。 2006年&#xff0c;拥有“必胜客”、“肯德基”等品牌的餐饮巨头百胜集团&#xff0c;组织两百多名区域经理…

太阳能光伏发电应用场景有哪些?

随着全球能源结构的转型和环保意识的提升&#xff0c;太阳能光伏发电作为一种清洁、可再生的能源形式&#xff0c;其应用场景正日益广泛。下面&#xff0c;我们将详细探讨太阳能光伏发电的主要应用场景。 首先&#xff0c;工业领域是太阳能光伏发电的重要应用领域。工业厂房通常…

EasyCVR视频汇聚平台海康Ehome2.0与5.0设备接入时的配置区别

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Nessus【部署 01】Linux环境部署漏洞扫描工具Nessus最新版详细过程分享(下载+安装+注册+激活)

Nessus最新版详细部署过程分享 1. 获取激活码2.主程序下载安装启动2.1 下载2.2安装2.3 启动 3.许可证及插件3.1 许可证获取3.2 插件安装 4.安装总结 Nessus官方网站&#xff1a; https://www.tenable.com/products/nessus/nessus-essentials 及介绍&#xff1a; 国际数据公司&…

AMBE-2000

这份文件是关于AMBE-2000™ Vocoder Chip的用户手册&#xff0c;由Digital Voice Systems, Inc. (DVSI) 提供。以下是手册的核心内容概要&#xff1a; 产品介绍&#xff1a; 产品介绍部分详细描述了AMBE-2000™ Vocoder Chip的主要特点和优势&#xff0c;以及它的应用领域。以下…

编程语言 MoonBit 本周有超多重磅更新等你来探索:expect 测试添加 inspect 函数,还有……

MoonBit 更新 1. expect 测试添加 inspect 函数 expect 测试添加针对 Show 接口的 inspect 函数&#xff0c;签名如下&#xff1a; pub fn inspect(obj: Show,~content: String "",~loc: SourceLoc _,~args_loc: ArgsLoc _ ) -> Result[Unit, String]⚠️ 此…

什么是软件缺陷(bug)?

什么是软件缺陷&#xff08;bug&#xff09;&#xff1f; 定义1&#xff1a;软件缺陷是计算机系统或程序中存在的任何一种破坏正常运行能力的问题或错误&#xff0c;或隐藏的功能缺陷或瑕疵。缺陷会导致软件产品在某种程度上不能满足用户的需求。 定义2&#xff1a;从产品内部…

ConfigMap和Secret配置Pod环境变量与热更新

目录 环境变量注入 卷挂载 最佳实践 在云原生应用开发和部署过程中&#xff0c;ConfigMap 和 Secret 是非常重要的资源对象&#xff0c;用于存储和管理应用程序的配置信息和敏感数据。然而&#xff0c;当我们更新 ConfigMap 或 Secret 的内容时&#xff0c;对于已经运行的 P…

C++函数重载引用

函数重载 自然语言中&#xff0c;一个词可以有多重含义&#xff0c;人们可以通过上下文来判断该词真实的含义&#xff0c;即该词被重载了。比如&#xff1a;以前有一个笑话&#xff0c;国有两个体育项目大家根本不用看&#xff0c;也不用担心。一个是乒乓球&#xff0c;一个是男…

Mybatis(3) web项目

web项目 1、准备2、分析3、 MyBatis对象作用域以及事务问题4、问题 实现一个转账系统 1、准备 ①准备一个web模块 在这里使用了maven archetype&#xff0c;选择web 之后会生成 一个web模块&#xff0c;但是不同的版本可能不同&#xff0c;在这里我就没有java和resources目录&…

KUKA机器人更改时间和HMI最小化设置

在使用 KUKA 机器人时&#xff0c;示教器上左边有个“表”的图标&#xff0c;点一下就会显示时间。但一般不准&#xff0c;想要更改时间可以通过HMI最小化后进行更改设置。更改时间需要将示教器界面最小化&#xff0c;也就是进入Windows 界面。通过以下步骤可以进行设置&#x…

ThreadLocal的基本使用

一、ThreadLocal的介绍 ThreadLocal 是 Java 中的一个类&#xff0c;它提供了线程局部变量的功能。线程局部变量是指每个线程拥有自己独立的变量副本&#xff0c;这些变量在不同的线程中互不影响。ThreadLocal 提供了一种在多线程环境下&#xff0c;每个线程都可以独立访问自己…

多叉树题目:N 叉树的最大深度

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;N 叉树的最大深度 出处&#xff1a;559. N 叉树的最大深度 难度 3 级 题目描述 要求 给定一个 N 叉树&#xf…

navicat12版本重置试用期时间

一、步骤 关闭NavicatWin R&#xff0c;输入regedit回车删除HKEY_CURRENT_USER\Software\PremiumSoft\Data删除HKEY_CURRENT_USER\Software\Classes\CLSID 二、这注册表直接删了&#xff0c;没什么安全问题 删了方便&#xff0c;只能这么说HKEY_CURRENT_USER\Software\Prem…

正弦实时数据库的应用(1)-数字孪生

前面说过实时数据库比较合适应用在数字孪生系统上&#xff0c;本篇就来对比一下数字孪生系统各种数据存储的应用方案的优缺点&#xff0c;几种典型的数据存储方式如下所示&#xff1a; 方案一&#xff1a;RedisMySQL/MongoDB方案二&#xff1a;MongoDB方案三&#xff1a;时序数…

算法6.4-6.6DFS

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2024.03.27 Last edited: 2024.03.27 目录 算法6.4-6.6DFS 第1关&#xff1a;算法6.5采用邻接矩阵表示图的深搜 任务描述 相关知识 编程要求…

2024银行业最新数字化转型的方法与路径

银行业数字化转型是一场由思想到行动、由顶层到基层、由内部到外部的深刻变革&#xff0c; 需要科学方法论的指导。在推动体系性重塑、开放生态建设、业务科技融合、基础设施升 级以及体制机制变革等探索和实践中&#xff0c;银行业逐步形成从顶层设计到数字化能力建设&#xf…