C++知识点总结(17):贪心算法

贪心算法

  • 一、文件操作
    • 1. 加头文件
    • 2. 加函数
    • 3. 写输入
  • 二、贪心算法
    • 1. 概念
    • 2. 洛谷P2240 最多的金币
      • 2.1 审题
      • 2.2 解题思路
      • 2.3 参考答案
    • 3. 洛谷P2240反向
      • 3.1 审题
      • 3.2 参考答案
    • 4. 贪心的资本家
      • 4.1 审题
      • 4.2 参考答案

一、文件操作

1. 加头文件

#include <cstdio>

cstdio 表示 C 语言中标准的输入输出。

2. 加函数

int main()
{freopen("输入文件名.in", "r", stdin);freopen("输出文件名.out", "w", stdout);// 这里写代码...fclose(stdin);fclose(stdout);return 0;
}

3. 写输入

在与程序同一目录下创建 name.in 文件,在里面输入要输入的内容,然后运行程序,得到 name.out 文件,就可以看到输出的内容了。

二、贪心算法

1. 概念

贪心算法 greedy algorithm
在对问题求解时,总是做出在当前看来是最好的选择,来期望达到整体最优。

2. 洛谷P2240 最多的金币

2.1 审题

题目描述

阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N ( N ≤ 100 ) N(N \le 100) N(N100) 堆金币,第 i i i 堆金币的总重量和总价值分别是 m i , v i ( 1 ≤ m i , v i ≤ 100 ) m_i,v_i(1\le m_i,v_i \le 100) mi,vi(1mi,vi100) 。阿里巴巴有一个承重量为 T ( T ≤ 1000 ) T(T \le 1000) T(T1000) 的背包,但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币?

输入格式

第一行两个整数 N , T N,T N,T
接下来 N N N 行,每行两个整数 m i , v i m_i,v_i mi,vi

输出格式

一个实数表示答案,输出两位小数。

样例1

输入

4 50
10 60 
20 100 
30 120 
15 45

输出

240.00 

2.2 解题思路

  • 求除 n n n 堆金币的单位价值,也就是这对金币的价值除以重量。
  • 把这 n n n 堆金币按照单价排序,从高到低遍历。
  • 如果背包中剩余的重量大于等于这对金币的重量,就把这对拿走。
  • 否则将这对金币分割,把剩余的空间全部装满。

2.3 参考答案

#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;int n, t;
double weight;struct Node
{int m, v;double per;
}a[105];bool cmp(Node a, Node b)
{return a.per > b.per;
}int main()
{cin >> n >> t;for (int i = 1; i <= n; i++){cin >> a[i].m >> a[i].v;a[i].dj = a[i].v * 1.0 / a[i].m; // 计算单价}sort(a+1, a+n+1, cmp); // 排序// 拿金币for (int i = 1; i <= n; i++){if (a[i].m <= t) // 不超载的情况下{weight += a[i].v; // 计算载重t -= a[i].m; // 计算剩余重量}else{weight += a[i].per * t;break;}}cout << fixed << setprecision(2) << w;return 0;
}

3. 洛谷P2240反向

3.1 审题

题目描述

有一批快递要装上一辆载重量为 c c c 的快递车进行运送。第 i i i 个快递的重量为 W i W_i Wi 。由于每件快递都很小,几乎不占快递车的空间,但是都比较重。为了节省成本,因此需要考虑在装载体积不受限制的情况下,将尽可能多的快递装上快递车,请你编程帮助快递小哥求出来最多能装载多少件快递。

输入描述

第一行共两个整数 N , c N,c N,c ,表示快递的件数和快递车的载重量。
第二行共有 N N N 个整数,分别表示快递的重量 W i W_i Wi

输出描述

共一行,输出 1 1 1 个整数,表示最多能装载的快递件数。

样例1

输入

8
400 100 200 50 90 150 50 20 80

输出

6

提示

对于 100 % 100% 100 的数据, N ≤ 100 N≤100 N100 c ≤ 10000 c≤10000 c10000

3.2 参考答案

#include <iostream>
#include <algorithm>
using namespace std;int n, c, maxn = 0;
int a[105];int main()
{cin >> n >> c;for (int i = 1; i <= n; i++){cin >> a[i];}sort(a+1, a+n+1);for (int i = 1; i <= n; i++){if (a[i] <= c){c -= a[i];maxn++;}else{break;}}cout << maxn;return 0;
}

4. 贪心的资本家

4.1 审题

题目描述

可多饭店本月新收到若干个不同的菜单,制作这些菜单上的菜的难易程度为一级、二级、三级…同样,能够制作不同难度菜单的厨师也被分为若干星级,并且 x x x 星级的厨师能够完成 x x x 级别及以下的所有菜单上的菜,高星级的菜优先由高星级的厨师完成。现有 m m m 个菜单需要制作, n n n 个空闲厨师,请问能否完成所有菜单呢?如果可以,最少的花费是多少呢?注:每个厨师当月只能完成一份菜单,厨师的工资就是厨师的星级。

输入描述

输入文件为 capital.in
输入第一行两个整数 m 和 n,分别表示需要制作的菜单量和空闲厨师的人数。
第二行 m 个整数,表示每个菜单的难易级别;
第三行 n 个整数,表示每个厨师的星级。

输出描述

输出文件为 capital.out
如果可以完成:第一行输出最小花费,接下来m行每行两个整数,分别表示菜单级别与相应的厨师级别(用空格隔开)。
否则,直接输出“Failed”

样例1

输入

5 2 
5 4 1 2 3 
7 8

输出

Failed

样例2

输入

5 7 
5 4 6 6 3 
3 5 9 10 6 8 5 

输出

27 
3 3 
4 5 
5 5 
6 6 
6 8

提示

1 ≤ n , m ≤ 20000 1\le n,m \le20000 1n,m20000

4.2 参考答案

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;int n, m, j, money;
int food[20005];
int cook[20005];struct Node
{int f, c;
}f[20005];int main()
{freopen("capital.in", "r", stdin);freopen("capital.out", "w", stdout);cin >> m >> n;if (n < m){cout << "Failed";fclose(stdin);fclose(stdout);return 0;}for (int i = 1; i <= m; i++){cin >> food[i];}for (int i = 1; i <= n; i++){cin >> cook[i];}sort(food+1, food+m+1);sort(cook+1, cook+n+1);j = 1;for (int i = 1; i <= m; i++){while (food[i] > cook[j]){j++;}if (j > n){cout << "Failed";fclose(stdin);fclose(stdout);return 0;}money += cook[j];f[i].f = food[i];f[i].c = cook[j];j++;}cout << money << endl;for (int i = 1; i <= m; i++){cout << f[i].f << " " << f[i].c << endl;}fclose(stdin);fclose(stdout);return 0;
}

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

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

相关文章

牛刀小试 - C++ 学生信息管理系统

参考文档&#xff1a; C实现&#xff1a;学生管理系统&#xff08;详细解析&#xff09; 关于switch中的default里面的break是否可以省略这件事 需求要求&#xff1a; &#xff08;1&#xff09;增加记录 &#xff08;2&#xff09;查找记录 &#xff08;3&#xff09;删除…

FFmpeg进阶-给视频添加马赛克效果

很多时候为了隐藏视频中的敏感信息如人脸、身份证号、车牌号等,我们会采用马赛克算法对视频帧中的一部分内容进行处理。这里介绍一下如何采用FFmpeg实现马赛克效果。 马赛克效果算法的原理如下: 1.分块处理:首先将图像划分为多个小块或区域 2.像素替换:对于每个小块,算法会将…

【Windows11】内存使用率只有总内存容量的一半

硬件配置&#xff1a;2根16G的内存条&#xff08;金百达DDR4 3600, 海力士颗粒&#xff0c;灯条刃&#xff09;&#xff0c;插在2和4通道上 系统配置&#xff1a;windows11 问题描述&#xff0c;我和这位网友的问题一模一样&#xff1a; 系统32G内存&#xff0c;开机完全识别&…

实习日志17

1.测试公司服务器 1.1.太卡了&#xff0c;点一下卡半天 上传项目源码和文件&#xff1a; 将活字格项目源码和所有相关文件上传到服务器的指定目录。可以使用向日葵远程控制或者版本控制系统来进行文件上传。 重新配置活字格项目&#xff1a; 根据服务器环境&#xff0c;需要对…

Java 学习和实践笔记(14):用表格来理解类、对象、属性以及动作(方法)很容易

OOP :面向对象编程&#xff0c;object oriented programming. 用表格就可以很好地理解类、对象、属性、以及动作这些概念。 一个表&#xff08;结构&#xff09;就对应一个类&#xff08;结构&#xff09;。所以凡叫什么类&#xff0c;自己就在心里把它叫什么表。反过来&…

设计模式-创建型模式-简单工厂模式

0 引言 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;&#xff1a;定义一个工厂类&#xff0c;它可以根据参数的不同返回不同类的实例&#xff0c;被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态&#xff08;static&#xf…

vue 非父子通信-event bus 事件总线

1.作用 非父子组件之间&#xff0c;进行简易消息传递。(复杂场景→ Vuex) 2.步骤 创建一个都能访问的事件总线 &#xff08;空Vue实例&#xff09; import Vue from vue const Bus new Vue() export default Bus A组件&#xff08;接受方&#xff09;&#xff0c;监听Bus的…

【图与网络数学模型】3.Ford-Fulkerson算法求解网络最大流问题

【图与网络数学模型】3.Ford-Fulkerson算法求解网络最大流问题 一、网络流模型1. 概述2. 可行流3. 增广链 二、示例1. 最大流问题2. Alternate Formulation&#xff1a;最小截量问题 三、Ford-Fulkerson 算法1. 导入库2. 初始化残差图3. 定义查找增广路径4. 定义循环5. 程序运行…

ubuntu22.04@Jetson Orin Nano之OpenCV安装

ubuntu22.04Jetson Orin Nano之OpenCV安装 1. 源由2. 分析3. 证实3.1 jtop安装3.2 jtop指令3.3 GPU支持情况 4. 安装OpenCV4.1 修改内容4.2 Python2环境【不需要】4.3 ubuntu22.04环境4.4 国内/本地环境问题4.5 cudnn版本问题 5. 总结6. 参考资料 1. 源由 昨天用Jetson跑demo程…

揭秘 LLMs 时代向量数据库的 3 大实用场景

过去一年&#xff0c;ChatGPT 和其他大语言模型&#xff08;LLMs&#xff09;的爆火也带动了向量数据库的发展。 许多用户在搭建检索增强生成&#xff08;RAG&#xff09;系统过程中选择了使用向量数据库 Zilliz Cloud &#xff0c;但 Zilliz Cloud 的功能不止于此&#xff0c;…

Git如何使用 五分钟快速入门

Git如何使用 五分钟快速入门 Git是一个分布式版本控制系统&#xff0c;它可以帮助开发人员跟踪和管理项目的代码变更。与传统的集中式版本控制系统&#xff08;如SVN&#xff09;不同&#xff0c;Git允许开发人员在本地存储完整的代码仓库&#xff0c;并且可以独立地进行代码修…

GEE数据更新——MODIS数据LST地表温度计算案例MODIS/006/ MOD11A1 已弃用并且没有新数据。请改用MODIS/061/ MOD11A1

问题 为什么我无法在下面给出的代码中下载 2024 年的数据?看起来有效期到 2022 年 11 月。你能帮我吗? 差异 MODIS/006/ MOD11A1和MODIS/061/ MOD11A1是两个不同的MODIS地表温度数据集。它们之间的差异主要体现在数据处理方法和时间范围上。目前GEE中已经没有前者的数据。…

《英伟达-本地AI》--NVIDIA Chat with RTX-本机部署

阿丹&#xff1a; 突然发现公司给配置的电脑是NVIDIA RTX 4060的显卡&#xff0c;这不搞一搞本地部署的大模型玩一玩&#xff1f;&#xff1f;&#xff1f; 从0-》1记录一下本地部署的全过程。 本地模型下载地址&#xff1a; Build a Custom LLM with Chat With RTX | NVIDIA…

虚拟机安装Centos7迷你版

虚拟机安装Centos7迷你版 迷你版较常规版精简了很多功能&#xff0c;所以体积也小了很多&#xff0c;喜欢自定义安装的可以选择迷你版 参考文章&#xff1a; VirtualBox虚拟机安装Centos7详细教程图解 网卡配置参考文章 下载Centos迷你版镜像 安装镜像 下载镜像 阿里云Cen…

Python 安装和使用的IDE

安装 安装 Anaconda (包较大), 包含了一些库安装 Miniconda (包较小) 只和 python 打包, 没有其他的包, 用的时候需要自己安装 conda install pandaspython pythonipython 有更多的功能 ipythonjupyter jupyter notebookjupyterlab 可以去 github 查看 conda install -c…

理论学习-ARM-内核

ARM内核 函数的调用加载、存储计算中断异常线程的切换 为了提高学习效率&#xff0c;我们要提前想好学习策略。 首先&#xff0c;使用频率越高的知识点&#xff0c;越要首先学习。假使&#xff0c;我们学习了一个知识点&#xff0c;能覆盖工作中80%的工作量&#xff0c;那是不是…

机器学习基础(四)非监督学习的进阶探索

导语&#xff1a;上一节我们详细探索监督学习的进阶应用&#xff0c;详情可见&#xff1a; 机器学习基础&#xff08;三&#xff09;监督学习的进阶探索-CSDN博客文章浏览阅读296次&#xff0c;点赞13次&#xff0c;收藏11次。监督学习作为机器学习的一个主要分支&#xff0c;…

【C++】vector模拟实现+迭代器失效

vector模拟实现 成员变量定义默认成员函数构造函数 迭代器范围for、对象类型匹配原则 容量操作sizeemptycapacityreserve成员变量未更新memcpy值拷贝 resize内置类型的构造函数 数据访问frontbackoperator[ ] 数据修改操作push_backpop_backswapclearinsertpos位置未更新无返回…

解决缓存失效导致的数据库压力问题(缓存击穿问题)

问题描述 在软件开发过程中&#xff0c;特别是在使用缓存策略优化数据访问性能时&#xff0c;经常会遇到缓存失效引发的问题。具体来说&#xff0c;在一个服务类BaseDataService中&#xff0c;findData方法负责从数据库拉取数据并缓存。这里使用了expireAfterWrite60s的缓存策…

【Linux】Linux调试器-gdb使用

1. 背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g 选项 2. 开始使用 gdb binFile 退出&#xff1a; ctrl d 或 quit 调…