贪心算法 求解思路
贪心算法简介
贪心算法是通过做一系列的选择来给出某一问题的最优解。对算法中的每一个决策点,做一个当时(看起来是)最佳的选择。这种启发式策略并不是总能产生出最优解,但它常常能给出最优解。
在实际设计贪心算法时,通常直接做出贪心选择来构造子结构,以产生一个待优化解决的子问题,或者,根据贪心选择来构造最优子结构。
贪心算法的一般做法
虽然贪心算法没有固定的解题模板,但一般情况下使用贪心算法,需要对问题进行分析,可以参考下面的解题步骤;
-
问题定义:明确问题的输入、输出和目标。
-
状态定义:**将问题分解为多个阶段,每个阶段都有一个状态。**状态通常由问题的某些属性表示。(如取最大值或者最小组等)
-
确定贪心策略:在每个阶段,根据当前状态选择最优决策,以期望达到全局最优解。这个最优决策通常是最优子结构的一部分,问题的最优解可以通过其子问题的最优解来获得,则问题具有最优子结构,这意味着每个阶段的最优决策都是全局最优解的一部分。
-
代码实现:根据上述步骤设计贪心算法,编写代码。通常,贪心算法包括一个循环,每次循环中都选择当前最优决策,并更新状态。
-
算法分析:分析贪心算法的正确性和可行性。
贪心算法实例
下面演示的题目来自 洛谷P1080 国王游戏的题目, 其问题的求解的核心就是拆解问题,将问题分为小问题,并且取局部最优解。本题涉及的内容包括 贪心算法+高精度的变换。
求解思路:

代码:
#include<bits/stdc++.h>
using namespace std;
struct temp{int l,r,all;
}a[1005];
bool cmp(temp a,temp b){return a.all<b.all;
}
int main(){int n;int result = 0;cin>>n;for(int i=0;i<=n;i++){cin>>a[i].l>>a[i].r;a[i].all=a[i].l*a[i].r;}sort(a+1,a+n+1,cmp);int sum=1;for(int i=1;i<=n;i++){sum*=a[i-1].l;if(sum/a[i].r > =result){result = sum / a[i].r;}}cout<<result;return 0;
}
测试情况如下所示,可以看到在不考虑高精度的情况也是得分能达到60分,故此在平时做题时,当涉及到贪心算法的应用时,需要将问题进行拆解细分为小问题,并且运用数学逻辑将问题简答化(建议采用假设方法)。

正确AC解法:
#include <bits/stdc++.h> using namespace std;struct stu {int l; // 大臣的左手数int r; // 大臣的右手数} f[1005]; // 定义结构体数组 f,最多可容纳 1005 位大臣// 比较函数,用于排序bool cmp(stu a, stu b) {return a.l * a.r < b.l * b.r; // 按左手数和右手数的乘积升序排序}int n; // 大臣数量vector<int> ans(1, 0); // 初始化答案向量,初始值为 0vector<int> t(1, 1); // 初始化乘积向量,初始值为 1// 高精度数乘法inline vector<int> mul(vector<int> &a, int b) {vector<int> res; // 存储结果的向量int t = 0; // 进位int len = a.size(); // 输入向量的长度for (int i = 0; i < len; i++) {t += a[i] * b; // 乘以 bres.push_back(t % 10); // 取当前位t /= 10; // 更新进位}while (t) { // 处理剩余的进位res.push_back(t % 10);t /= 10;}return res; // 返回乘法结果}// 高精度数除法inline vector<int> div(vector<int> &a, int b) {vector<int> res; // 存储结果的向量int r = 0; // 余数int len = a.size(); // 输入向量的长度for (int i = len - 1; i >= 0; i--) { // 从低位到高位处理r = 10 * r + a[i]; // 将当前位加入余数if (r >= b) { // 如果余数大于等于除数res.push_back(r / b); // 计算商并存入结果r %= b; // 更新余数} else {res.push_back(0); // 商为0}}vector<int> cnt; // 存储结果的向量(逆序)len = res.size();for (int i = len - 1; i >= 0; i--) {cnt.push_back(res[i]); // 逆序存取结果}// 去掉前导零while ((cnt.back() == 0) && (cnt.size() > 1)) {cnt.pop_back();}return cnt; // 返回除法结果}// 比较两个高精度数inline int compare(vector<int> &a, vector<int> &b) {int lenA = a.size();int lenB = b.size();if (lenA != lenB) { // 长度不同return lenA - lenB; // 返回长度差} else { // 长度相同for (int i = lenA - 1; i >= 0; i--) {if (a[i] != b[i]) { // 从高位比较return a[i] - b[i]; // 返回差值}}return 0; // 相等}}int main() {cin >> n; // 输入大臣数量cin >> f[0].l >> f[0].r; // 输入国王的左手数和右手数for (int i = 1; i <= n; i++) { // 输入每位大臣的左右手数cin >> f[i].l >> f[i].r;}sort(f + 1, f + 1 + n, cmp); // 按照比较函数排序大臣t = mul(t, f[0].l); // 将国王的左手数乘入乘积for (int i = 1; i <= n; i++) { // 遍历每位大臣vector<int> res = div(t, f[i].r); // 计算当前大臣的金币数if (compare(ans, res) < 0) { // 如果当前金币数更大ans = res; // 更新结果}t = mul(t, f[i].l); // 更新乘积,乘入当前大臣的左手数}int len = ans.size(); // 获取结果的长度for (int i = len - 1; i >= 0; i--) { // 输出结果(逆序)cout << ans[i];}cout << endl; // 输出换行return 0; // 返回成功}相关文章:
贪心算法 求解思路
贪心算法简介 贪心算法是通过做一系列的选择来给出某一问题的最优解。对算法中的每一个决策点,做一个当时(看起来是)最佳的选择。这种启发式策略并不是总能产生出最优解,但它常常能给出最优解。 在实际设计贪心算法时࿰…...
2025/2/25,字节跳动后端开发一面面经
一、双方简单自我介绍 面试官先自我介绍,之后属于面试官看简历过程,基本不听。 二、实习中遇到最难的事情,怎么解决的 主要问的还是实习中做过的项目,项目难点在哪里(自己参与的地方),面对困难是怎么思考,怎么实际操作解决的。 三、项目实现细节 掌握自己项目的实…...
Buildroot 添加自定义模块-内置文件到文件系统
目录 概述实现步骤1. 创建包目录和文件结构2. 配置 Config.in3. 定义 cp_bin_files.mk4. 添加源文件install.shmy.conf 5. 配置与编译 概述 Buildroot 是一个高度可定制和模块化的嵌入式 Linux 构建系统,适用于从简单到复杂的各种嵌入式项目. buildroot的源码中bui…...
SpringBoot新闻推荐系统设计与实现
随着信息时代的快速发展,新闻推荐系统成为用户获取个性化内容的重要工具。本文将介绍一个幽络源的基于SpringBoot开发的新闻推荐系统,该系统功能全面,操作简便,能够满足管理员和用户的多种需求。 管理员模块 管理员模块为系统管…...
领域驱动设计:事件溯源架构简介
概述 事件溯源架构通常由3种应用设计模式组成,分别是:事件驱动(Event Driven),事件溯源(Event Source)、CQRS(读写分离)。这三种应用设计模式常见于领域驱动设计(DDD)中,但它们本身是一种应用设计的思想,不仅仅局限于DDD,每一种模式都可以单独拿出来使用。 E…...
基于Java+Spring+Mybsita+mysql的汽租车辆共享平台的设计源码+设计文档
文末获取源码数据库文档 感兴趣的可以先收藏,有毕设问题,项目以及论文撰写等问题都可以和博主沟通,尽最大努力帮助更多的人! 目录 1软件需求 1.1引言 1.1.1编写目的 1.1.2背景 1.2 绪论 1.2.1-Internet与…...
深度学习的正则化深入探讨
文章目录 一、说明二、学习目标三、什么是机器学习中的正则化四、了解过拟合和欠拟合五、代价函数的意义六、什么是偏差和方差?七、机器学习中的正则化? 一、说明 在训练机器学习模型时,模型很容易过拟合或欠拟合。为了避免这种情况…...
Token相关设计
文章目录 1. 双Token 机制概述1.1 访问令牌(Access Token)1.2 刷新令牌(Refresh Token) 2. 双Token 认证流程3. Spring Boot 具体实现3.1 生成 Token(使用 JWT)3.2 解析 Token3.3 登录接口(返回…...
【时序预测】在线学习:算法选择(从线性模型到深度学习解析)
——如何为动态时序预测匹配最佳增量学习策略? 引言:在线学习的核心价值与挑战 在动态时序预测场景中(如实时交通预测、能源消耗监控),数据以流式(Streaming)形式持续生成,且潜在的…...
React antd的datePicker自定义,封装成组件
一、antd的datePicker自定义 需求:用户需要为日期选择器的每个日期单元格添加一个Tooltip,当鼠标悬停时显示日期、可兑换流量余额和本公会可兑流量。这些数据需要从接口获取。我需要结合之前的代码,确保Tooltip正确显示,并且数据…...
学生管理前端
文章目录 首页student.html查询功能 首页 SpringBoot前端html页面放在static文件夹下:/src/main/resources/static 默认首页为index.html,我们可以用两个超链接或者两个button跳转到对应的页面。这里只是单纯的跳转页面,不需要提交表单等其…...
深入理解并实现自定义 unordered_map 和 unordered_set
亲爱的读者朋友们😃,此文开启知识盛宴与思想碰撞🎉。 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 在 C 的标准模板库(STL)中,unorder…...
顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-大模型电话机器人
语音流直接对接Realtime API 多模态大模型 直接把音频流输出给大模型,大模型返回音频流。 顶顶通CTI对Realtime API 的支持 提供了以下2个APP可对接任意 •cti_audio_stream 通过TCP推流和播放流,适合用于人机对话场景。 •cti_unicast_start 通过旁…...
kinova机械臂绿色灯一闪一闪及刷机方法
一、背景 实验室有两个kinova mico机械臂,但经常出现操纵杆上的绿色灯一闪一闪的,导致无法使用操纵杆或ROS进行控制,下面给出官方的教程以及所需要的FS 0CPP 0008_6.2.5_mico_6dof.hex文件。 重要的东西写在前面: a、如果出现操…...
第16天:C++多线程完全指南 - 从基础到现代并发编程
第16天:C多线程完全指南 - 从基础到现代并发编程 一、多线程基础概念 1. 线程创建与管理(C11) #include <iostream> #include <thread>void hello() {std::cout << "Hello from thread " << std::this_…...
中科大计算机网络原理 1.5 Internt结构和ISP
一、互联网的层次化架构 覆盖范围分层 主干网(Tier-1级) 国家级或行业级核心网络,承担跨区域数据传输和全球互联功能。例如中国的四大主干网(ChinaNET、CERNET等)以及跨国运营商(如AT&T、Deuts…...
Windows安装sql server2017
看了下官网的文档,似乎只有ubuntu18.04可以安装,其他debian系的都不行,还有通过docker的方式安装的。 双击进入下载的ISO,点击执行可执行文件,并选择“是” 不要勾选 警告而已,不必理会 至少勾选这两…...
计算机网络之传输层(tcp协议)
一、TCP协议的特点 面向连接:TCP使用面向连接的通信模式,通信双方需要先建立连接,然后才能进行数据的传输。连接建立过程采用三次握手的方式。 可靠性:TCP提供可靠的数据传输服务,确保数据的完整性、有序性和正确性。…...
从零到一:如何用阿里云百炼和火山引擎搭建专属 AI 助手(DeepSeek)?
本文首发:从零到一:如何用阿里云百炼和火山引擎搭建专属 AI 助手(DeepSeek)? 阿里云百炼和火山引擎都推出了免费的 DeepSeek 模型体验额度,今天我和大家一起搭建一个本地的专属 AI 助手。 阿里云百炼为 …...
Open3D解决SceneWidget加入布局中消失的问题
Open3D解决SceneWidget加入布局中消失的问题 Open3D解决SceneWidget加入布局中消失的问题1. 问题2. 问题代码3. 解决 Open3D解决SceneWidget加入布局中消失的问题 1. 问题 把SceneWidget加到布局管理其中图形可以展示出来,但是鼠标点击就消失了。 stackoverflow上已…...
用快马快速构建API限流演示原型,直观理解rate limit exceeded
最近在开发一个需要调用第三方API的项目时,遇到了"rate limit exceeded"的错误提示。为了更直观地理解API限流机制,我决定用InsCode(快马)平台快速搭建一个演示原型。整个过程比想象中简单很多,分享下我的实现思路和经验。 项目构思…...
在 Matplotlib 中fontweight一般怎么设置
fontweight一般怎么设置,还有其他设置吗fontweight一般怎么设置,还有其他设置吗⚖️ fontweight 的设置方法使用字符串(推荐)使用数字🎨 其他常用文本设置1. 字体基本属性2. 布局与外观属性3. 添加背景框 (bbox)&#…...
transformer 优化笔记 持续更新
目录 方案2:安装 xformers(推荐) 🚀 核心作用:更高效地计算注意力 xfusers 💡 为什么需要 xfusers? 方案2:安装 xformers(推荐) pip install xformers 然…...
Bilibili API Python客户端深度解析与实战指南
Bilibili API Python客户端深度解析与实战指南 【免费下载链接】bilibili-api 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址:https://github.com/MoyuScript/bilibili-api 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-ap…...
Hikyuu性能优化技巧:从AMD 7950x实测看量化平台的极致速度
Hikyuu性能优化技巧:从AMD 7950x实测看量化平台的极致速度 【免费下载链接】hikyuu Hikyuu Quant Framework 基于C/Python的极速开源量化交易研究框架,同时可基于策略部件进行资产重用,快速累积策略资产。 项目地址: https://gitcode.com/g…...
Qwen3.5-9B图文理解效果展示:JPEG/PNG上传问答真实作品
Qwen3.5-9B图文理解效果展示:JPEG/PNG上传问答真实作品 1. 惊艳的多模态理解能力 Qwen3.5-9B作为一款90亿参数的开源大语言模型,在多模态理解方面展现出了令人印象深刻的能力。特别是其变体Qwen3.5-9B-VL,能够同时处理文本和图像输入&#…...
从SolidWorks到Simulink动画:手把手教你用URDF和Simscape搭建六轴机械臂仿真模型
六轴机械臂仿真全流程:从SolidWorks建模到Simulink动画生成实战指南 当我在实验室第一次看到自己设计的机械臂在Simulink中流畅地完成抓取动作时,那种成就感至今难忘。许多机器人工程师都曾面临这样的困境:在SolidWorks中精心设计的机械臂模型…...
别再死记硬背了!用Python+Matplotlib动态可视化5G NR的帧结构与RB资源分配
用Python动态解析5G NR帧结构:从理论到可视化实战 在通信技术快速迭代的今天,5G NR(新空口)作为第五代移动通信的核心技术,其灵活的帧结构设计一直是工程师和研究者关注的焦点。传统学习方式往往依赖静态图表和文字描述,让许多初学…...
ICLR 2026 | 大模型当裁判也“翻车“?北大清华联合多校提出TrustJudge,让LLM评估更值得信赖
让 GPT-4 给两篇文章打分,A 拿了 4 分、B 拿了 3 分。按常理 A 应该比 B 好吧?但换成成对比较,同一个模型却说 "B 更好"。更离谱的情况也有——A > B > C > A 的"石头剪刀布"循环,连传递性都守不住。…...
黑苹果配置自动化:OpCore-Simplify实现EFI智能生成的技术革命
黑苹果配置自动化:OpCore-Simplify实现EFI智能生成的技术革命 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 为什么90%的黑苹果配置失败源…...
