算法设计与分析复习--贪心(一)

文章目录

  • 上一篇
  • 贪心的性质
  • 活动安排问题
  • 贪心背包问题
  • 最优装载
  • 哈夫曼编码
  • 下一篇

上一篇

算法设计与分析复习–动态规划

贪心的性质

在这里插入图片描述
贪心和动态规划都要求问题具有最优子结构;
可用贪心方法时,动态规划可能不适用
可用动态规划方法时,贪心方法可能不适用

活动安排问题

AcWing 908. 最大不相交区间数量

产生最优解的排序是按照结束时间从小到大排序,看不重合区间的数量

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>using namespace std;typedef pair<int, int> PII;//使用pair存储一个时间段
const int N = 100010;int n;
vector<PII> a;bool cmp(PII x, PII y)
{return x.second < y.second;//结束时间小的排前面
}int main()
{scanf("%d", &n);for (int i = 0; i < n; i ++){int l, r;scanf("%d%d", &l, &r);a.push_back({l, r});}sort(a.begin(), a.end(), cmp);// 按结束时间进行先后排序int res = 1, ed = a[0].second;for (auto i : a){if (i.first > ed){//不重合就加上,更新edres ++;ed = i.second;}}printf("%d", res);return 0;
}

贪心背包问题

与一般的背包问题不一样,开始给出的是整个物品的重量和价值,但是可以只放这个物品的一部分=>贪心背包
在这里插入图片描述
按单价排序是贪心背包的解决方法

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>using namespace std;typedef pair<double, double> PII;//存在小数情况都要改成double类型
const int N = 1010;int n, c;
double w[N], v[N];
vector<PII> ob;bool cmp(PII x, PII y)
{return (x.second / x.first) > (y.second / y.first); 
}int main()
{scanf("%d%d", &n, &c);for (int i = 0; i < n; i ++) scanf("%lf", &w[i]); // 读取为double类型for (int i = 0; i < n; i ++) scanf("%lf", &v[i]); // 读取为double类型for (int i = 0; i < n; i ++) ob.push_back({w[i], v[i]});sort(ob.begin(), ob.end(), cmp);double bv = 0, cw = 0;for (auto i : ob){cw += i.first;if (cw > c){bv += (c - (cw - i.first)) * (i.second / i.first); // 把之前加上的i.first要先减掉break;}bv += i.second;}printf("%.2lf", bv); // 输出精度为两位小数return 0;
}

在这里插入图片描述

最优装载

在这里插入图片描述
贪心选择策略:重量最轻者优先装载

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>using namespace std;
typedef pair<int, int> PII;const int N = 100010;int n, c, x[N], cc;
vector<PII> ob;int main()
{scanf("%d%d", &n, &c);for (int i = 0; i < n; i ++){int w;scanf("%d", &w);ob.push_back({w, i});}sort(ob.begin(), ob.end());int res = 0;for (auto i : ob){cc += i.first;if (cc <= c){res ++;x[i.second] = 1;}else{x[i.second] = 0;   }}printf("%d\n", res);for(int i = 0; i < n; i ++) printf("%d ", x[i]);return 0;
}

在这里插入图片描述
在这里插入图片描述

哈夫曼编码

在这里插入图片描述
在这里插入图片描述
产生这种前缀码的方式称为哈夫曼树

哈夫曼树相关习题AcWing 148. 合并果子

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>using namespace std;const int N = 10010;int n;
priority_queue<int, vector<int>, greater<int> > heap;int main()
{scanf("%d", &n);for (int i = 0; i < n; i ++){int x;scanf("%d", &x);heap.push(x);}int res = 0;while (heap.size() > 1){int x = 0;x += heap.top(); heap.pop();x += heap.top(); heap.pop();heap.push(x);res += x;}printf("%d", res);return 0;
}

在这里插入图片描述

下一篇

未完待续

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

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

相关文章

中国制库:创新引领,效率突破,塑造行业新标准

制库是一家专注于企业知识应用的在线SAAS平台,主要构成部分包括制度、表单、流程、制问和集合。作为集合了各种管理制度的平台,制库不仅提供了丰富的制度资源,还通过SAAS版实现了知识集成、修订和应用的全流程。目标是打造中国全面的企业制度库,帮助企业快速建立核心管理系统,并…

iTerm2+oh-my-zsh搭建Mac电脑上终端环境

根据苹果网站上介绍&#xff0c;bash是 macOS Mojave 及更早版本中的默认Shell&#xff0c;从 macOS Catalina 开始&#xff0c;zsh(Z shell) 是所有新建用户帐户的默认Shell。 1. 安装Oh my zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzs…

⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ MySQL存储过程 1. 介绍2. 使用3. 变量①系统变…

详解ssh远程登录服务

华子目录 简介概念功能 分类文字接口图形接口 文字接口ssh连接服务器浅浅介绍一下加密技术凯撒加密加密分类对称加密非对称加密非对称加密方法&#xff08;也叫公钥加密&#xff09; ssh两大类认证方式&#xff1a;连接加密技术简介密钥解析 ssh工作过程版本协商阶段密钥和算法…

AtCoder Beginner Contest 329 题解A~F

A - Spread 输入字符串&#xff0c;字符之间加上空格输出 B - Next 输出数组当中第二大的数 C - Count xxx 统计每个字符出现过的最长长度&#xff0c;再累加即可 #include<bits/stdc.h> #pragma GCC optimize("Ofast") #define INF 0x3f3f3f3f #define I…

C++多线程编程(3):接收线程处理函数的返回值

文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 文章目录 处理带返回值的函数asyncpackaged_taskpromise 处理带返回值的函数 有三种方法&#xff1a; asyncpackaged_taskpromise async 第一种方法是使用 async 函数。 步骤&#xff1a; 使用 async 创建线程处理函…

C++多线程编程(1):线程的创建方式

文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 文章目录 进行与线程C中如何实现多线程创建线程的多种方式无参函数lambda表达式常成员函数not常成员引用函数智能指针仿函数类的普通成员函数综合测试 进行与线程 多线程是指多个线程并发执行的过程。 进程与线程的关系&…

QTableWidget——表格的合并与拆分

一、整体思路 表格的操作使用QTableView::setSpan可以实现表格的行和列的合并 表格拆分没有对应的处理函数 主要思路&#xff1a;对表格的属性、内容、拆分与合并的参数进行存储&#xff0c;在进行拆分时对表格内容进行重新创建&#xff08;不考虑效率问题&#xff09; 二、效…

C/C++ 语言 ‘ == ‘ 运算符仅适用于算数表达式

示例代码&#xff1a; #include <stdio.h>typedef struct {int a;int b; } TestStruct;int main(void) {TestStruct testA { 0 }, testB { 0 };if (testA testB) {printf("You can do this!\n");}return 0; }

HTTP1.0协议详解

前言主要特点存在的不足与HTTP1.1的区别在Java中应用HTTP1.0协议知识拓展 前言 HTTP是由蒂姆伯纳斯李&#xff08;Tim Berners-Lee&#xff09;爵士创造的。他在1989年提出了一个构想&#xff0c;借助多文档之间相互关联形成的超文本&#xff08;HyperText&#xff09;&#x…

【心得】PHP的文件上传个人笔记

目录 1 php的文件上传绕过 黑名单绕过 2 php文件上传的00截断 3 iconv字符转换异常后造成了字符截断 4 文件后缀是白名单的时候的绕过 web服务器的解析漏洞绕过 5.高级文件上传绕过 1 .htaccess nginx.htaccess 2 服务端内容检测 3 配合伪协议来绕过 4.配合日志包含绕…

智能电力监测系统

智能电力监测系统是一种先进的电力监控技术&#xff0c;它结合了互联网、物联网、大数据、人工智能等先进技术&#xff0c;对电力系统的运行状态进行实时监测和分析。以下是智能电力监测系统的主要功能和优势&#xff1a; 一、主要功能&#xff1a; 实时数据监测&#xff1a;智…