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

news2024/11/25 7:11:58

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.coloradmin.cn/o/1053801.html

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

相关文章

VS Code 如何搭建 C/C++开发环境

目录 VScode是什么? VScode的下载和安装? 2.1 下载和安装 安装&#xff1a; 2.2 环境的介绍 环境介绍&#xff1a;​编辑 安装中文插件&#xff1a; VScode配置 C/C 开发环境 3.1 下载和配置MinGW-w64 编译器套件 下载&#xff1a; 配置MinGW64&#xff1a; 3.2 安…

排序篇(六)----排序小结

排序篇(六)----排序小结 排序算法复杂度及稳定性分析 直接插入排序的算法复杂度&#xff1a; 最好情况下&#xff0c;当数组已经有序时&#xff0c;直接插入排序的时间复杂度为O(n)&#xff0c;其中n是数组的大小。最坏情况下&#xff0c;当数组逆序排列时&#xff0c;直接插…

【python海洋专题二】读取水深nc文件并水深地形图

【python海洋专题二】读取水深nc文件并水深地形图 海洋与大气科学 导入函数包 from netCDF4 import Dataset import numpy as np import matplotlib.pyplot as plt 前两个上期更新说明了&#xff1a;第一个读取nc文件&#xff0c;第二个用于计算。 matplotlib.pyplot&#xf…

Audacity 使用教程:轻松录制、编辑音频

Audacity 使用教程&#xff1a;轻松录制、编辑音频 1. 简介 Audacity 是一款免费、开源且功能强大的音频录制和编辑软件。它适用于 Windows、Mac 和 Linux 等多种操作系统&#xff0c;适合音乐制作、广播后期制作以及普通用户进行音频处理。本教程将带领大家熟悉 Audacity 的…

Linux 基本语句_4_指针和函数

指针函数 顾名思义&#xff0c;即返回值为指针的函数 int * f (int n){int *p NULL;//空指针return p;//返回一个地址 }函数指针 指向函数的指针&#xff0c;每个函数都有自己的入口地址&#xff0c;函数指针专门指向这些地址#include <stdio.h>int max(int a, int b)…

【LeetCode热题100】--226.翻转二叉树

226.翻转二叉树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

10.1 File类

前言&#xff1a; java.io包中的File类是唯一一个可以代表磁盘文件的对象&#xff0c;它定义了一些用于操作文件的方法。通过调用File类提供的各种方法&#xff0c;可以创建、删除或者重命名文件&#xff0c;判断硬盘上某个文件是否存在&#xff0c;查询文件最后修改时间&…

HTTP的请求方法,空行,body,介绍请求报头的内部以及粘包问题

目录 一、GET与POST简介 二、空行和body 三、初识请求报头以及粘包问题 四、认识请求报头剩余部分 一、GET与POST简介 GET https://www.sogou.com/HTTP/1.1 请求报文中的方法&#xff0c;是最常规的方法&#xff08;获取资源&#xff09; POST&#xff1a;传输实体主体的方法…

MACH架构的质量工程指南

MACH是快速创建高质量应用的最佳实践&#xff0c;同时也意味着有助于团队内的质量工程。本文介绍了MACH在质量工程领域所起的作用&#xff0c;并介绍了成功的MACH架构必备的8个要素。原文: MACH Architecture: The Quality Engineering Guide MACH和质量工程有关。 在过去几年里…

点餐小程序实战教程02用户注册

按照我们的需求分析&#xff0c;本篇开始我们进入到具体的开发部分。低代码开发的基础是先创建数据源&#xff0c;我们本篇介绍用户注册功能&#xff0c;先需要创建一个用于存放用户信息的数据源。 1 用户分类 未使用过低代码工具的初学者&#xff0c;可能对低代码的用户分类…

集合-ArrayList源码分析(面试)

系列文章目录 1.集合-Collection-CSDN博客​​​​​​ 2.集合-List集合-CSDN博客 3.集合-ArrayList源码分析(面试)_喜欢吃animal milk的博客-CSDN博客 目录 系列文章目录 前言 一 . 什么是ArrayList? 二 . ArrayList集合底层原理 总结 前言 大家好,今天给大家讲一下Arra…

【LeetCode热题100】--94.二叉树的中序遍历

94.二叉树的中序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {…

Ubuntu安装zsh之后搜狗起不来

1. 问题描述 装了Ubuntu22.04后&#xff0c;先装了搜狗&#xff0c;再装了zsh&#xff0c;装完zsh之后发现搜狗起不来了&#xff0c;重装搜狗和fcitx之后还是起不来&#xff0c;在此记录解决过程。 2. 解决方法 参考博客: 配置zsh后&#xff0c;无法通过 DBus 连接到 Fcitx,…

2023年中国劳保用镜市场规模现状及行业需求前景分析[图]

眼睛对人体的重要性可谓不言而喻。同时&#xff0c;眼睛也是很脆弱的人体器官。特别是在生产过程中&#xff0c;由于异物、有毒气体等侵害&#xff0c;眼睛就很容易受伤&#xff0c;随着现代工业的发展&#xff0c;劳保镜已成为一种必不可少的工具&#xff0c;它不仅可以保护工…

ARTS 打卡 第四周,游刃有余

引言 时间过得好快&#xff0c;已经到了第四周学习打卡环节&#xff0c;也是本次活动的最后一周。认识三掌柜的想必都知道&#xff0c;我持续创作技术博客已经有6年时间了&#xff0c;固定每个月发布不少于6篇博文。同时&#xff0c;自己作为一名热爱分享的开发者&#xff0c;像…

jmh的OperationsPerInvocation参数

背景 最近再看fllink的性能基准测试时&#xff0c;发现它使用了OperationsPerInvocation注解&#xff0c;本文就来记录下这个注解的含义 官方解释 从官方文档&#xff1a;http://javadox.com/org.openjdk.jmh/jmh-core/0.9/org/openjdk/jmh/annotations/OperationsPerInvoca…

1.4.C++项目:仿muduo库实现并发服务器之buffer模块的设计

项目完整版在&#xff1a; 一、buffer模块&#xff1a; 缓冲区模块 Buffer模块是一个缓冲区模块&#xff0c;用于实现通信中用户态的接收缓冲区和发送缓冲区功能。 二、提供的功能 存储数据&#xff0c;取出数据 三、实现思想 1.实现换出去得有一块内存空间&#xff0c;采…

预编译(3)

目录 命名约定&#xff1a; #undef 命令行定义 条件编译 常见的条件编译指令 头⽂件的包含 头⽂件被包含的⽅式&#xff1a; 本地⽂件包含 库⽂件包含 嵌套文件包含 命名约定&#xff1a; 一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者那我们平…

代码随想录-哈希表|ACM模式

目录 前言&#xff1a; &#xff08;1&#xff09;基本概念 &#xff08;2&#xff09;常见的三种哈希结构 242.有效字母的异位词 题目描述&#xff1a; 输入输出描述&#xff1a; 思路和想法: 349. 两个数组的交集 题目描述&#xff1a; 输入输出描述&#xff1a; …

Mac上如何修复损坏的音频?试试iZotope RX 10,对音频进行处理,提高音频质量!

iZotope RX 10是一款由iZotope公司开发的音频修复和编辑软件。它被广泛用于电影、电视、音乐和游戏等行业的音频后期制作&#xff0c;以及声音设计和修复工作。 在RX 10中&#xff0c;iZotope从头开始重新设计了全新的Repair Assistant修复助手&#xff0c;并且推出了相应的修…