【C++贪心】P8769 [蓝桥杯 2021 国 C] 巧克力|普及+

【C++贪心】P8769 [蓝桥杯 2021 国 C] 巧克力|普及+

本文涉及知识点

C++贪心

[蓝桥杯 2021 国 C] 巧克力

题目描述

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

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

输入格式

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

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

输出格式

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

样例 #1

样例输入 #1

10 3 1 6 5 2 7 3 3 10 10 

样例输出 #1

18 

提示

【样例说明】

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

【评测用例规模与约定】

对于 30 % 30\% 30% 的评测用例, n , x ≤ 1000 n,x \le 1000 n,x≤1000。

对于所有评测用例, 1 ≤ n , x ≤ 1 0 5 1\le n,x\le 10^5 1≤n,x≤105, 1 ≤ a i , b i , c i ≤ 1 0 9 1 ≤ a_i,b_i ,c_i\le10^9 1≤ai​,bi​,ci​≤109。

蓝桥杯 2021 国赛 C 组 I 题。

贪心

如果价格低的和价格高的,竞争同一天。淘汰价格高的。如果两个都能保留或都不能保留,结果一样。如果保留一个,显然保留价格低的合适。
按价格排序。
有序映射记录需要巧克了的天数。初始:1到x。
依次枚举各巧克力。
如果剩余数量为0,处理其它巧克力。
如果s中存在小于等于保质期的数字。将此巧克力分配一块到保质期内最后一天。如果没有,处理下一个巧克力。
如果最终s非空,返回-1。否则返回分配的巧克力之和。

2025年11月19

第x天吃一块保质期x的巧克力。
第x-1天吃保质期 ≥ x − 1 \ge x-1 ≥x−1的巧克力
⋮ \vdots ⋮
第1天吃保质期 ≥ 1 \ge 1 ≥1的巧克力。
第i天小根堆记录保质期 ≥ i \ge i ≥i的巧克力的价格和数量。

代码

核心代码

#include<iostream>#include<sstream>#include<vector>#include<map>#include<unordered_map>#include<set>#include<unordered_set>#include<string>#include<algorithm>#include<functional>#include<queue>#include<stack>#include<iomanip>#include<numeric>#include<math.h>#include<climits>#include<assert.h>#include<bitset>usingnamespace std;template<classT=int> vector<T>Read(int n,constchar* pFormat ="%d"){ vector<T> ret; T d ;while(n--){scanf(pFormat,&d); ret.emplace_back(d);}return ret;}template<classT=int> vector<T>Read(constchar* pFormat ="%d"){int n;scanf("%d",&n); vector<T> ret; T d;while(n--){scanf(pFormat,&d); ret.emplace_back(d);}return ret;} string ReadChar(int n){ string str;char ch;while(n--){do{scanf("%c",&ch);}while(('\n'== ch)); str += ch;}return str;}classSolution{public:longlongDo(int x, vector<int>& a, vector<int>& b, vector<int>& c){constint N = a.size(); vector<int>inxs(N);iota(inxs.begin(), inxs.end(),0);sort(inxs.begin(), inxs.end(),[&](int i1,int i2){return a[i1]< a[i2];}); set<int> need;for(int i =1; i <= x; i++){ need.emplace(i);}longlong ans =0;for(int i : inxs){for(int cnt =0; cnt < c[i]; cnt++){auto it = need.upper_bound(b[i]);if(need.begin()== it){break;}--it; need.erase(it); ans += a[i];if(need.empty()){return ans;}}}return-1;}};intmain(){#ifdef_DEBUGfreopen("a.in","r",stdin);#endif// DEBUGint x,n;scanf("%d%d",&x,&n); vector<int> a, b, c;int t1, t2, t3;for(int i =0; i < n; i++){scanf("%d%d%d",&t1,&t2,&t3); a.emplace_back(t1); b.emplace_back(t2); c.emplace_back(t3);}auto res =Solution().Do(x,a, b, c); cout << res << std::endl;return0;}

单元测试

int x; vector<int> a, b, c;TEST_METHOD(TestMethod11){ x =10, a ={1,2,3}, b ={6,7,10}, c ={5,3,10};auto res =Solution().Do(x, a, b, c);AssertEx(18LL, res);}TEST_METHOD(TestMethod12){ x =10, a ={1}, b ={100}, c ={9};auto res =Solution().Do(x, a, b, c);AssertEx(-1LL, res);}TEST_METHOD(TestMethod13){ x =10, a ={1}, b ={9}, c ={10};auto res =Solution().Do(x, a, b, c);AssertEx(-1LL, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步ZEEKLOG学院,听白银讲师(也就是鄙人)的讲解。
https://edu.ZEEKLOG.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.ZEEKLOG.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

Read more

GitHub 44K 星!Skills:开源「智能体技能库」+ 手搓创建技能

2026年,AI的战场已从“回答问题”转向“完成任务”。 你是否想过: ✅ 能否让AI自动分析GitHub仓库并提交PR? ✅ 能否让AI读完一篇论文后,自动生成PPT并邮件发送给团队? ✅ 能否让AI在发现线上Bug后,自动回滚版本并通知运维? 这些不再是幻想—— 一个名为 Skills 的开源项目,正在让AI智能体(Agent)真正拥有“做事”的能力 。 此仓库包含Anthropic为Claude实现的技能。 截至2026年1月,该项目已在GitHub收获 44,000+ Stars ,被Hugging Face、LangChain、LlamaIndex等主流框架深度集成,被誉为 “AI智能体的操作系统级技能库” 。 今天,我们就来揭开它的神秘面纱。  什么是Skills? Skills (全名: )是一个 开放、模块化、可组合的智能体技能仓库 。 它的核心理念很简单: “不要让AI从零开始学做事,而是给它一套标准化的‘技能工具箱’。” 就像人类通过学习“开车”“做饭”“写代码”来完成复杂任务,

By Ne0inhk
20 万星开源神器 OpenClaw 全解析:程序员 + 视频博主双视角实战体验

20 万星开源神器 OpenClaw 全解析:程序员 + 视频博主双视角实战体验

2026 年初,AI 圈最大的黑马非OpenClaw莫属。这个从 Clawdbot、Moltbot 迭代而来的开源项目,在 GitHub 上星标狂飙至 21.7 万,成为现象级 AI Agent 框架。作为一名拥有 7 年大数据开发经验的程序员,同时也是正在转型视频剪辑的博主,我深度体验了这款工具近一个月,发现它不仅能解放开发者的双手,更能为内容创作带来革命性的效率提升。本文将从技术架构、核心功能、安装部署、双身份实战体验四个维度,带你全面解锁 OpenClaw 的奥秘。 一、核心定位与起源:从 “聊天 AI” 到 “能干活的数字员工” 1. 精准定义 一句话概括:OpenClaw 是本地可自托管、多渠道交互、具备强执行能力的开源 AI Agent 执行引擎。它打破了传统

By Ne0inhk

本地部署 OpenClaw:让 AI 真正“干活”的开源智能体,从核心概念到实战全流程

本地部署 OpenClaw:让 AI 真正“干活”的开源智能体,从核心概念到实战全流程 这里写目录标题 * 本地部署 OpenClaw:让 AI 真正“干活”的开源智能体,从核心概念到实战全流程 * 一、核心概念:读懂 OpenClaw 与 Skills * 1. OpenClaw:本地优先的自主 AI 内核 * 2. Skills:AI 助手的“功能插件库” * (1)Skills 核心构成 * (2)加载路径与优先级 * (3)必装核心 Skills * 二、前置准备:部署前必做的 3 件事 * 1. 系统与硬件要求 * 2. 强制依赖安装

By Ne0inhk

FPGA毕设从入门到实践:选题避坑、开发流程与Verilog实战指南

最近在帮学弟学妹们看FPGA毕业设计,发现大家踩的坑都出奇地一致:仿真波形看着挺美,一下载到板子就“沉默是金”;或者功能勉强能跑,但时序报告一堆红色警告,心里直发虚。今天我就结合自己的经验,系统梳理一下FPGA毕设从选题到上板的完整流程,希望能帮你避开那些“前辈们”用头发换来的教训。 一、FPGA毕设那些“经典”的坑 毕业设计时间紧、任务重,很多问题如果前期没意识到,后期调试会非常痛苦。下面这几个是高频雷区: 1. 仿真与现实的“壁”:这是最常见的问题。Testbench里时钟是理想的,复位是干净的,但板子上有晶振抖动、按键消抖、电源噪声。仿真通过的UART收发,上板后可能因为波特率误差累积而错码。关键:仿真要加入时钟抖动(#(CLK_PERIOD/10))和复位异步释放的模型,尽量逼近真实环境。 2. 时钟域的“混战”:一个工程里用了板载50MHz时钟,又通过PLL生成125MHz给DDR控制器,还接了个外部异步的传感器数据。如果不同时钟域的信号直接通信,没有经过同步器(如两级触发器),亚稳态就会导致数据采样错误,

By Ne0inhk