数据结构与算法:贪心(一)

前言

有一说一贪心的题目真的ex,想不到就是想不到……

一、贪心

贪心就是通过在过程中每次达到局部最优,从而在最后实现整体最优。贪心的题目经常要用到排序和堆。

越打cf越能感受到贪心的奇妙,很吃状态和灵感。解题的过程中往往依赖举大量例子,然后进行总结和归纳,然后才能发现规律。当然不排除怎么举都想不到的情况,此处点名上次edu的b题斐波那契叠正方形。

二、题目

1.最大数

class Solution {
public://经典问题:组成字典序最小的字符串 -> 重新定义比较规则:a+b<b+a,比较拼接后结果string largestNumber(vector<int>& nums) {//转字符串vector<string>arr(nums.size());for(int i=0;i<nums.size();i++){arr[i]=to_string(nums[i]);}//最大字典序sort(arr.begin(),arr.end(),[&](const string &a,const string &b){return a+b>b+a;});//特判if(arr[0]=="0"){return "0";}string ans;for(string s:arr){ans+=s;}return ans;}
};

这个题我记得上学期在洛谷就刷到过一道类似的,当时第一次写,然后很幸运地踩坑里了……T^T

多举几个例子观察一下就能发现,不管是从小到大排序还是从大到小排序,都无法保证拼出来的字符串字典序最大,所以就要考虑重新定义比较规则。这里的方法是,比较两个字符串a和b,以a+b和b+a这两种拼接方式拼接后的字典序大小。若a+b的字典序更大,就让a排在b前。

这个初见真的想不到……

2.两地调度

class Solution {
public:int twoCitySchedCost(vector<vector<int>>& costs) {int n=costs.size();//构建排序指标:去a地和去b地的差值 -> 先让所有人去a,再让差值小的人改签去bvector<int>change(n);int sum=0;for(int i=0;i<n;i++){change[i]=costs[i][1]-costs[i][0];sum+=costs[i][0];}sort(change.begin(),change.end());int m=n/2;for(int i=0;i<m;i++){sum+=change[i];}return sum;}
};

这个题的关键还是对排序策略的定义。

思路是,先让所有人都去a,然后考察每个人从a转去b的代价,让代价最小的n个人去b。所以就是根据每个人去b的代价减去去a的代价从小到大排序,最后再把前n个人的这个代价加上即可。

3.吃掉 N 个橘子的最少天数

class Solution {
public:int minDays(int n) {map<int,int>dp;return dfs(n,dp);}//记忆化搜索int dfs(int n,map<int,int>&dp){if(n==0){return 0;}if(n==1){return 1;}if(dp[n]!=0){return dp[n];}//贪心策略:大于1的话必然选择按比例吃!!int ans=min(n%2+1+dfs(n/2,dp),n%3+1+dfs(n/3,dp));dp[n]=ans;return ans;}
};

这个题的贪心策略就是,当剩余数量大于1的时候必然选择按比例吃。此时,可能要先根据余数吃到能按比例吃的状态。所以在记忆化搜素的过程中,就是先把当前数量除以2或3的余数吃了,再按比例吃一次,之后去后续调递归,取最小值即可。

4.会议室

虽然这是个付费题,但转化一下就能发现,这就是之前线段重合的问题,一模一样。这里直接就放线段重合的代码了。

#include <bits/stdc++.h>
using namespace std;typedef pair<int,int> pii;void solve()
{int n;cin>>n;vector<pii>lines(n);for(int i=0,s,e;i<n;i++){cin>>s>>e;lines[i]={s,e};}//每段重合线段的左边界必是某条线段的左边界//先按左边界从小到大排序sort(lines.begin(),lines.end(),[&](const pii &a,const pii &b){return a.first<b.first;});priority_queue<int,vector<int>,greater<int>>heap;//小根堆int ans=0;for(int i=0;i<

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

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

相关文章

5、Spring AI(MCPServer+MCPClient+Ollama)开发环境搭建_第一篇

前言&#xff1a; 该开发环境是在 3、后端持久化&#xff08;SpringBoot3.5.0MybatisPlus3.5.5mysql8.4.0&#xff09;环境搭建 上进行改造的&#xff0c;用到了后端持久化&#xff0c;主要改造的地方为数据库把email字段改为height&#xff08;身高&#xff09;&#xff0c;…

个典型的 Java 泛型在反序列化场景下“类型擦除 + 无法推断具体类型”导致的隐性 Bug

今天遇到一个问题&#xff1a;一个典型的 Java 泛型在反序列化场景下“类型擦除 无法推断具体类型”导致的隐性 Bug&#xff0c;尤其是在 RPC&#xff08;如 Dubbo、Feign 等&#xff09;和 本地 JVM 内直连调用共存时&#xff0c;这种问题会显现得非常明显。 A 服务暴露了一…

开发指南121-微服务的弹性伸缩

平台的后台服务表现形式就是各种各样的微服务。微服务可以部署在不同的机器上。单一服务的伸缩很简单&#xff1a; 部署在不同机器上&#xff0c;直接启动关闭即可。 部署在同一机器上&#xff0c;可以复制为多个不同目录&#xff0c;其中jar包&#xff0c;启动文件是完全一样…

【C++特殊工具与技术】优化内存分配(六):运行时类型识别

目录 一、RTTI 的核心机制与设计背景 1.1 RTTI 的设计目标 1.2 RTTI 的启动条件 二、dynamic_cast&#xff1a;动态类型转换 2.1 语法与核心特性 2.2 转换场景详解 2.3 引用类型转换与异常处理 2.4 性能注意事项 三、typeid&#xff1a;类型信息查询 3.1 语法与核心特…

USB串口通信、握手协议、深度学习等技术要点

基于OpenMV的智能车牌识别系统&#xff1a;从硬件到算法的完整实现 前言 本文将详细介绍一个基于OpenMV微控制器的智能车牌识别系统的设计与实现。该系统集成了嵌入式视觉处理、串口通信协议、深度学习OCR识别等多种技术&#xff0c;实现了从图像采集到车牌识别的完整流程。 …

猎板PCB:手机主板pcb需要做哪些可靠性测试

在智能手机高度普及的今天&#xff0c;一块指甲盖大小的主板承载着通信、计算、影像等核心功能。当消费者为新机性能欢呼时&#xff0c;鲜少有人关注到主板PCB&#xff08;印刷电路板&#xff09;在幕后经历的严苛考验。这些隐藏在金属外壳下的精密线路&#xff0c;需要经过多轮…

Java并发编程实战 Day 21:分布式并发控制

【Java并发编程实战 Day 21】分布式并发控制 文章简述&#xff1a; 在高并发和分布式系统中&#xff0c;传统的线程级锁已无法满足跨节点的同步需求。本文深入讲解了分布式并发控制的核心概念与技术方案&#xff0c;包括分布式锁、一致性算法&#xff08;如Paxos、Raft&#x…

C语言文件操作与预处理详解

目录 文件操作文件基本概念文件指针文件打开模式文件读取操作字符读取字符串读取格式化读取二进制读取 文件写入操作字符写入字符串写入格式化写入二进制写入 文件定位操作文件错误处理 预处理预处理基本概念常见预处理指令文件包含指令宏定义简单宏带参数的宏字符串化操作符(#…

水库大坝安全监测之渗流监测

水库大坝的渗流状况直接关系到其结构稳定性与安全运行。渗流可能引发坝体内部土体的渗透变形&#xff0c;如管涌、流土等现象&#xff0c;削弱坝体强度&#xff0c;严重时甚至导致大坝垮塌&#xff0c;威胁下游人民生命财产安全。通过渗流监测&#xff0c;能够实时掌握坝体及坝…

windows使用命令行查看进程信息

在 Windows 操作系统中&#xff0c;您可以使用多种命令行工具来查看进程信息。以下是几种常用方法&#xff1a; 1. 使用 tasklist 命令&#xff08;最常用&#xff09; 查看所有进程的基本信息&#xff1a; tasklist输出示例&#xff1a; 映像名称 PID…

【C#】多级缓存与多核CPU

多级缓存&#xff08;如CPU的L1/L2/L3缓存&#xff09;与多核处理器之间存在紧密的协同与竞争关系&#xff0c;直接影响系统性能。以下是关键影响及优化策略&#xff1a; 一、缓存层级与多核的协作机制 缓存结构 L1缓存 私有缓存&#xff1a;每个CPU核心独享&#xff0c;容量小…

PostgreSQL的扩展adminpack

PostgreSQL的扩展adminpack adminpack 是 PostgreSQL 提供的一个管理扩展&#xff0c;它包含多个实用函数&#xff0c;帮助数据库管理员执行文件系统操作和维护任务。这个扩展通常由数据库超级用户使用&#xff0c;提供了一些服务器端的文件访问功能。 一、adminpack 扩展概述…

Unity | AmplifyShaderEditor插件基础(第九集:旗子进阶版)

目录 一、&#x1f44b;&#x1f3fb;前言 二、准备工作 1.下载安装插件ProBuilder 2.下载安装插件Polybrush 3.固定原理 4.旗子 三、顶点上色 1.创建一个可以顶点上色的材质 2.开始上色 a.上色功能说明 b.全部上色 c.调整刷子 四、shader的设置 1.幅度添加 2.顶…

Java 实现 Excel 转化为 PDF

引言 在实际开发中&#xff0c;将 Excel 文件转化为 PDF 格式是一项常见需求。例如在需要共享数据报表时&#xff0c;PDF 格式具有更好的兼容性和安全性。GrapeCity Documents for Excel&#xff08;GcExcel&#xff09;为 Java 开发者提供了强大的工具&#xff0c;可轻松实现…

Spring Boot3批式访问Dify聊天助手接口

Spring Boot3批式访问Dify聊天助手接口 前言 之前已经配置好Dify1.4.1及LM Studio集成&#xff1a; https://lizhiyong.blog.csdn.net/article/details/148607462 现在就可以借助Spring Boot3去访问Dify的后端接口&#xff0c;让前端展示大模型的返回内容。这是我等大数据资…

事务传播行为详解

一、事务传播行为的基本概念 事务传播行为是Spring 框架中事务管理的核心概念&#xff0c;用于定义当一个事务方法被另一个事务方法调用时&#xff0c;事务应如何传播。通俗地说&#xff0c;它解决了 “多个事务方法嵌套调用时&#xff0c;新方法是加入现有事务还是创建新事务…

Java八股文——Spring「SpringMVC 篇」

MVC分层介绍一下 面试官您好&#xff0c;MVC是一种非常经典、影响深远的软件设计模式&#xff0c;它的全称是Model-View-Controller。在我看来&#xff0c;它的核心目标就是解决早期Web开发中&#xff0c;业务逻辑、数据和界面显示高度耦合的问题&#xff0c;从而实现“各司其…

FreeSWITCH mod_curl 和 mod_xml_rpc 测试

编辑 /usr/local/freeswitch/conf/autoload_configs/xml_rpc.conf.xml <configuration name"xml_rpc.conf" description"XML RPC"> <settings> <param name"http-port" value"8889"/> <param name&quo…

实时监控、秒级决策:镜舟科技如何重塑融资融券业务数据处理模式

融资融券业务作为证券市场的重要组成部分&#xff0c;已成为金融机构核心业务增长点和利润来源。截至 2023 年底&#xff0c;我国融资融券余额已突破 1.8 万亿元&#xff0c;业务量呈现爆发式增长。然而&#xff0c;在业务高速发展的同时&#xff0c;金融机构面临着数据处理效率…

Linux与量子计算:面向未来的架构演进

Linux与量子计算&#xff1a;面向未来的架构演进 当经典计算遇上量子革命 引言&#xff1a;量子计算时代的黎明 量子计算正从理论走向工程实践&#xff0c;Linux作为现代计算的基石&#xff0c;正在量子革命中扮演关键角色。据IBM预测&#xff0c;到2027年&#xff0c;量子优势…