算法竞赛备赛之贪心算法训练提升,贪心算法基础掌握

1.区间问题

905.区间选点

给定N个闭区间[ai, bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。

输出选择的点的最小数量,位于区间端点上的点也算作是区间内。

  1. 将每个按区间的右端点从小到大排序

  2. 从前往后依次枚举每个区间

  3. 如果当前区间中已经包含点,则直接pass

  4. 否则,选择当前区间的右端点

#include<iostream>
#include<algorithm>
​
using namespace std;
​
const int N = 100010;
​
int n;
struct Range
{int l, r;bool operator< (const Range &W)const{return r < W.r;}
}range[N];
​
int main()
{scanf("%d", &n);for(int i = 0;i < n; i++){int l, r;scanf("%d%d", &l, &r);range[i] = {l, r};}sort(range, range + n);int res = 0, ed = -2e9;for(int i = 0;i < n; i++)if(range[i].l > ed){res++;ed = range[i].r;}printf("%d\n", res);return 0;
}

908.最大不相交区间数量

给定N个比区间[ai, bi],请你在数轴选择若干区间,使得选中的区间之间互不相交(包括端点)

输出可选取区间的最大数量。

#include<iostream>
#include<algorithm>
​
using namespace std;
​
const int N = 100010;
​
int n;
struct Range
{int l, r;bool operator< (const Range &W)const{return r < W.r;}
}range[N];
​
int main()
{scanf("%d", &n);for(int i = 0;i < n; i++){int l, r;scanf("%d%d", &l, &r);range[i] = {l, r};}sort(range, range + n);int res = 0, ed = -2e9;for(int i = 0;i < n; i++)if(range[i].l > ed){res++;ed = range[i].r;}printf("%d\n", res);return 0;
}

906.区间分组

给定N个闭区间[α,b:],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。

输出最小组数。

将这些区间按照起始点从小到大的顺序排序,然后从前往后遍历每个区间。如果这个区间能够加入到已经存在的某一个组,就将其随便加入一个可行的组;如果这个区间不能加入到已经存在的任何一个组,就新建一个组,组中只包含这个区间。

#include<iostream>
#include<algorithm>
#include<queue>
​
using namespace std;
​
const int N = 100010;
​
int n;
struct Range
{int l, r;bool operator< (const Range &W)const{return l < W.l;}
}range[N];
​
int main()
{scanf("%d", &n);for(int i = 0;i < n; i++){int l, r;scnaf("%d%d", &l, &r);range[i] = {l, r};}sort(range, range + n);priority_queue<int, vector<int>, greater<int>> heap;for(int i = 0;i < n; i++){auto r = range[i];if(heap.empty() || heap.top() >= r.l) heap.push(r.r);else{int t = heap.top();heap.pop();heap.push(r.r);}}printf("%d\n", heap.size());return 0;
}

907.区间覆盖

给定N个闭区间[ai, bi]以及一个线段区间[s, t]。请你选择尽量少的区间,将指定线段区间完全覆盖,

输出最少区间数,如果无法完全覆盖则输出-1。

1 5

3

-1 3

2 4

3 5

输出:2

  1. 将所有区间左端点从小到大排序

  2. 从前往后依次枚举每个区间,在所有能覆盖start的区间中,选择右端点最大的区间

  3. 然后将start更新成右端点的最大值

#include<iostream>
#include<algorithm>
​
using namespace std;
​
const int N = 100010;
​
int n;
struct Range
{int l, r;bool operator< (const Range &W){return l < W.l;}
}range[N];
​
int main()
{int st, ed;scanf("%d%d", &st, &ed);scnaf("%d", &n);for(int i = 0;i < n; i++){int l, r;scanf("%d%d", &l, &r);range[i] = {l, r};}sort(range, range + n);int res = 0;bool success = false;for(int i = 0;i < n; i++){int j = i, r = -2e9;while(j < n && range[j].l <= st){r = max(r, range[j].r);j++;}if(r < st){res = -1;break;}res++;if(r >= ed){success = true;break;}st = r;i = j - 1;}if(!success) res = -1;printf("%d\n", res);return 0;
}

2.Huffman树

148.合并果子

在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。

达达决定把所有的果子合成一堆。

每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。

可以看出,所有的果子经过 n−1n−1 次合并之后,就只剩下一堆了。

达达在合并果子时总共消耗的体力等于每次合并所耗体力之和。

因为还要花大力气把这些果子搬回家,所以达达在合并果子时要尽可能地节省体力。

假定每个果子重量都为 11,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使达达耗费的体力最少,并输出这个最小的体力耗费值。

例如有 33 种果子,数目依次为 1,2,91,2,9。

可以先将 1、21、2 堆合并,新堆数目为 33,耗费体力为 33。

接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 1212,耗费体力为 1212。

所以达达总共耗费体力=3+12=15=3+12=15。

可以证明 1515 为最小的体力耗费值。

#include<iostream>
#include<algorithm>
#include<queue>
​
using namespace std;
​
int main()
{int n;scanf("%d", &n);priority_queue<int, vector<int>, greater<int>> heap;while(n--){int x;scanf("%d", &x);heap.push(x);}int res = 0;while(heap.size() > 1){int a = heap.top(); heap.pop();int b = heap.top(); heap.pop();res += a + b;heap.push(a + b);}printf("%d\n", res);return 0;
}

3.排序不等式

913.排队打水

有n个人排队到1个水龙头处打水,第i个人装水桶所需时长是ti,请问如何安排他们打水顺序才能是所有人的等待时间之和最短。

7

3 6 1 4 2 5 7

56

案例分析 0 3 9 10 14 16 21

#include<iostream>
#include<algorithm>
​
using namespace std;
​
const int N = 100010;
​
typedef long long LL;
​
int n;
int t[N];
​
int main()
{scanf("%d", &n);for(int i = 0;i < n; i++)scanf("%d", &t[i]);sort(t, t + n);LL res = 0;for(int i = 0;i < n; i++)res += t[i] * (n - i - 1);printf("%lld\n", res);return 0;
}

4.绝对不等式

104.货仓选址

在一条数轴上有 NN 家商店,它们的坐标分别为 A1∼AN。

现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。

为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。

#include<iostream>
#include<algorithm>
​
using namespace std;
​
const int N = 100010;
​
int n;
int a[N];
​
int main()
{scanf("%d", &n);for(int i = 0;i < n; i++)scanf("%d", &a[i]);sort(a, a + n);int res = 0;for(int i = 0;i < n; i++)res += abs(a[i] - a[n / 2]);printf("%d\n", res);return 0;
}

5.推公式

125.耍杂技的牛

农民约翰的 N 头奶牛(编号为 1..N)计划逃跑并加入马戏团,为此它们决定练习表演杂技。

奶牛们不是非常有创意,只提出了一个杂技表演:

叠罗汉,表演时,奶牛们站在彼此的身上,形成一个高高的垂直堆叠。

奶牛们正在试图找到自己在这个堆叠中应该所处的位置顺序。

这 N 头奶牛中的每一头都有着自己的重量 Wi 以及自己的强壮程度 Si。

一头牛支撑不住的可能性取决于它头上所有牛的总重量(不包括它自己)减去它的身体强壮程度的值,现在称该数值为风险值,风险值越大,这只牛撑不住的可能性越高。

您的任务是确定奶牛的排序,使得所有奶牛的风险值中的最大值尽可能的小。

#include<iostream>
#include<algorithm>
​
using namespace std;
​
typedef pair<int, int> PII;
​
const int N = 50010;
​
int n;
PII cow[N];
​
int main()
{scanf("%d", &n);for(int i = 0;i < n; i++){int w, s;scanf("%d%d", &w, &s);cow[i] = {w + s, w};}sort(cow, cow + n);int res = -2e9, sum = 0;for(int i = 0;i < n; i++){int w = cow[i].second, s = cow[i].first - w;res = max(res, sum - s);sum += w;}printf("%d\n", res);return 0;
}

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

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

相关文章

记录:Unity脚本的编写

目录 前言添加脚本到unity编写c#脚本查看效果 前言 在学习软件构造这门课的时候&#xff0c;对unity和c#进行了 一定程度的学习&#xff0c;包括简单的建立地形&#xff0c;添加对象&#xff0c;添加材质等&#xff0c;前不久刚好学习了如何通过c#脚本对模型进行操控&#xff…

五、2023.10.1.C++stl.5

文章目录 65、请说说 STL 的基本组成部分?66、请说说 STL 中常见的容器&#xff0c;并介绍一下实现原理&#xff1f;67、请说说 STL 中常见的容器&#xff0c;并介绍一下实现原理&#xff1f;68、请你来介绍一下 STL 的空间配置器&#xff08;allocator&#xff09;&#xff1…

分布式并行训练(DP、DDP、DeepSpeed)

[pytorch distributed] 01 nn.DataParallel 数据并行初步 数据并行 vs. 模型并行 数据并行&#xff1a;模型拷贝&#xff08;per device&#xff09;&#xff0c;数据 split/chunk&#xff08;对batch切分&#xff09; 每个device上都拷贝一份完整模型&#xff0c;每个device分…

密码技术 (5) - 数字签名

一. 前言 前面在介绍消息认证码时&#xff0c;我们知道消息认证码虽然可以确认消息的完整性&#xff0c;但是无法防止否认问题。而数字签名可以解决否认的问题&#xff0c;接下来介绍数字签名的原理。 二. 数字签名的原理 数字签名和公钥密码一样&#xff0c;也有公钥和私钥&am…

字符串函数(一)

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 字符串函数&#xff08;一&#xff09; 0.前言1.求字符串长度的函数1.1 strlen&#xff08;字符串长度&#xff09; 2.长度不受限制的字符串函数2.1 strcpy&#xff08;字符串拷贝&#xff0…

直播协议 python 常见直播协议

1. 推流、直播 和 点播分别是什么意思&#xff1f; 推流 主播将本地视频源和音频源推送到云服务器&#xff0c;也被称为“RTMP发布”。 直播 即直接观看主播实时推送过来的音视频数据。 点播 视频源已经事先存储于云服务器之上的音视频文件&#xff0c;观众随时可以观看。 目…

怒刷LeetCode的第22天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;回溯算法 方法二&#xff1a;基于位运算的回溯 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;动态规划 方法二&#xff1a;分治法 方法三&#xff1a;前缀和数组 第三题 题目来源 题目内容…

Acwing 842. 排列数字

Acwing 842. 排列数字 知识点题目描述思路讲解代码展示 知识点 DFS 题目描述 思路讲解 DFS重点是&#xff1a;顺序&#xff01;&#xff08;暴力的手法&#xff09;&#xff08;递归&#xff09; 用 path 数组保存排列&#xff0c;当排列的长度为 n 时&#xff0c;是一种方…

【Leetcode】 17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits "23" 输出&…

Java笔记五(数组)

目录 数组 数组声明创建 数组初始化的三种初始化类型&#xff1a; 静态初始化 动态初始化 数组的默认初始化 数组的四个基本特点 数组边界 数组的使用 示例一&#xff1a;计算所有的元素和以及查找最大元素 示例二&#xff1a;For-Each循环 示例三&#xff1a;数组作…

Ubuntu 安装 Docker 的详细步骤

文章目录 简介1.更新2.安装必要的软件包2.1 基于阿里源 3.验证 Docker 安装是否成功4.安装后的一些常规设置及常用的命令4.1 启动 Docker4.2 Docker 在系统启动时自动运行4.3 运行一个 Hello World 镜像4.4 查看docker运行状态 欢迎来到这篇关于在 Ubuntu 上安装 Docker 的教程…

鞋类 整鞋试验方法 剥离强度

声明 本文是学习GB-T 3903.3-2011 鞋类 整鞋试验方法 剥离强度. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 GB/T 3903 的本部分规定了整鞋鞋底与鞋帮或外底与外中底之间剥离强度的试验方法。 本部分适用于采用模压、硫化、注塑、灌注、胶…

【c++随笔07】常量、变量、static

【c随笔07】常量、变量、static 1、常量、变量1.1、声明变量1.2、使用常量 2、static介绍2.1、static 局部变量2.2、static 全局变量2.3、C static静态成员变量2.4、C static静态成员函数详解 原创地址&#xff0c;https://zhengjunxue.blog.csdn.net/article/details/13167770…

【数据结构】——顺序表详解

大家好&#xff01;当我们学习了动态内存管理后&#xff0c;就可以写一个管理数据的顺序表了&#xff01;&#xff01;&#xff01; 顺序表的理解&#xff1a; 线性表是最基本、最简单、也是最常用的一种数据结构。线性表&#xff08;linear list&#xff09;是数据结构的一种…

02-Zookeeper实战

上一篇&#xff1a;01-Zookeeper特性与节点数据类型详解 1. zookeeper安装 Step1&#xff1a; 配置JAVA环境&#xff0c;检验环境&#xff1a; java -versionStep2: 下载解压 zookeeper wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeepe…

响应式设计的实现方式

一. 什么是响应式 响应式网站设计是一种网络页面设计布局。页面的设计与开发应当根据用户行为以及设备环境&#xff08;系统平台&#xff0c;屏幕尺寸&#xff0c;屏幕定向等&#xff09;进行相应的响应和调整。 响应式网站常见特点&#xff1a; 1. 同时适配PC平板手机。 2…

Win10自带输入法怎么删除-Win10卸载微软输入法的方法

Win10自带输入法怎么删除&#xff1f;Win10系统自带输入法就是微软输入法&#xff0c;这个输入法满足了很多用户的输入需求。但是&#xff0c;有些用户想要使用其它的输入法&#xff0c;这时候就想删除掉微软输入法。下面小编给大家介绍最简单方便的卸载方法吧。 Win10卸载微软…

Hive【Hive(三)查询语句】

前言 今天是中秋节&#xff0c;早上七点就醒了&#xff0c;干啥呢&#xff0c;大一开学后空教室紧缺&#xff0c;还不趁着假期来学校等啥呢。顺便偷偷许个愿吧&#xff0c;希望在明年的这个时候&#xff0c;秋招不知道赶不赶得上&#xff0c;我希望拿几个国奖&#xff0c;蓝桥杯…

淘宝天猫复制商品链接粘贴到草柴查优惠券iPhone苹果手机粘贴弹窗怎么关闭?

经常在淘宝、天猫、京东网购&#xff0c;挑选商品后复制链接&#xff0c;到草柴APP查询要购买商品的优惠券和返利&#xff0c;iPhone苹果手机每次粘贴复制的商品链接都弹窗提示特别烦人。接下来分享如何关闭草柴APP复制粘贴提醒的弹窗&#xff1b; 如何永久关闭iPhone苹果手机复…

去雨去雪去雾算法之本地与服务器的TensorBoard使用教程

在进行去雨去雾去雪算法实验时&#xff0c;需要注意几个参数设置&#xff0c;num_workers只能设置为0&#xff0c;否则会报各种稀奇古怪的错误。 本地使用TensorBoard 此外&#xff0c;发现生成的文件是events.out.tfevents格式的&#xff0c;查询了一番得知该文件是通过Tens…