贪心算法

news/2025/2/23 12:48:28

 int a[1000], b=5, c=8;
 swap(b, c);    // 交换操作
 memset(a, 0, sizeof(a)); // 初始化为0或-1

引导问题

为一个小老鼠准备了M磅的猫粮,准备去和看守仓库的猫做交易,因为仓库里有小老鼠喜欢吃的五香豆,第i个房间有J[i] 磅的五香豆,并且需要用F[i]磅的猫粮去交换;求老鼠最多可换多少豆?若五香豆不能全换猫粮,按比例换。

Sample Input 
  5 3 ——M猫粮   N房间
  7 2 ——五香豆  猫粮
  4 3
  5 2
  -1 -1 —— 结束

Sample Output
  13.333

由按比例换,7/2=3.5  4/3=1.333...  5/2=2.5  3.5最大 排序,一次换——7+5+1.3333=13.333


初识贪心

在对问题求解时,总是做出在当前看来是最好的选择

也就是说,不从整体上加以考虑,所作出的仅仅是在某种意义上的局部最优解(是否是全局最优,需要证明)。


例题

1.田忌赛马

每个马跟比自己弱的程度最小的马

1.排序

2.蓝色最大和红色最大比较,看蓝色能不能比过红色,若比不过,拿蓝色最小的跟红色比

3.拿蓝色最大跟红色第二大的比...能比就比,不能就继续拿最差的跟最好的比


反证法上大分~事件序列问题

已知N个事件的发生时刻和结束时刻。

一些在时间上没有重叠的事件,可以构成一个事件序列,如事件{2,8,10}。

事件序列包含的事件数目,称为该事件序列的长度。

请编程找出一个最长的事件序列。

至少存在一个最长事件序列包含最早结束事件(最早结束事件是0)

反证法证明上句:

假设所有最长事件序列都不包含最早结束事件;只要证明这个假设是错的,原命题得证;

任取一个所谓的最长事件序列,把第一个事件去掉,换掉事件0,肯定跟后面都不冲突(因为换上的是最早结束的时间,原来都不冲突,现在更不冲突)

证明完后选中最早结束事件0   后面我做类似的:每次找一个最早结束的事件,只要和前面的不冲突的都选中;


2.搬桌子

一个公司要做调整搬桌子,房间有400个,一边是单号,一边双号;

走廊很窄,只通过1个桌子过;

输入:

第二行:趟数

第三行:房间号:10号搬到20号

每趟搬要10min:不重叠可以同时搬,要10min;重叠要分开搬

法一:与上题的思想差不多,只不过,改成了最早开始事件(找开始最早的)

法二:统计每个区间在时间轴上的重叠次数,并找出最大重叠次数的区间。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int t, i, j, N, P[200];  // t是测试用例的数量,N是每个测试用例的区间数量
    int s, d, temp, k, MAX;  // s和d是区间的起点和终点,MAX用于记录最大重叠次数
    cin >> t;

    for (i = 0; i < t; i++) {
        // 初始化P数组,用于记录每个时间点的重叠次数
        for (j = 0; j < 200; j++)
            P[j] = 0;

        cin >> N;  // 读取当前测试用例的区间数量
        for (j = 0; j < N; j++) {
            cin >> s >> d;  // 读取区间的起点和终点
            s = (s - 1) / 2;  // 将起点转换为数组索引
            d = (d - 1) / 2;  // 将终点转换为数组索引

            // 如果起点大于终点,交换它们
            if (s > d) {
                temp = s;
                s = d;
                d = temp;
            }

            // 在区间[s, d]内的每个时间点增加计数
            for (k = s; k <= d; k++)
                P[k]++;
        }

        // 找到最大重叠次数
        MAX = -1;
        for (j = 0; j < 200; j++)
            if (P[j] > MAX)
                MAX = P[j];

        // 输出最大重叠次数乘以10
        cout << MAX * 10 << endl;
    }

    return 0;
}

3.删数问题

已知一个长度不超过240位的正整数n(其中不含有效字0),去掉其中任意s(s小于n的长度)个数字后,将剩下的数字按原来的左右次序组成一个新的正整数。

给定n和s,请编程输出最小的新正整数。

Sample Input
178543 4
Sample Output
13

法一:从左到右扫描逆序对,删掉左边的数,若没有逆序对,删掉最后一位数

1 7 84 3 —— 1 7 5 4 3 ——1 5 4 3 ——1 4 3 —— 1 3 

1 2 3


4.青蛙的邻居

每个湖泊都有一个青蛙,如果两个湖泊之间有水渠相连,我们认为两个青蛙他们为邻居;

问:你可以画出这个湖泊分布图吗?

Sample Input

3

7 —— 青蛙个数

4 3 1 5 4 2 1 —— 第一个青蛙有4个邻居;第二个青蛙有3个邻居....

6

4 3 1 4 2 0

6

2 3 1 1 2 1 

Sample Output

YES

NO

YES

 用以下知识可解决:


离散数学:可图性判定 

两个概念:

1.度序列:若把图A所有顶点的度数排成一个序列S,则称S为图A的度序列。

度:一个顶点他有几条边,度就是几

图A

2 3 1 1 1 就是度序列

2.序列是可图的:一个非负整数组成的有限序列如果是某个无向图的度序列,则称该序列是可图的。

若度序列2 3 1 1 1可以画出图A,就是可图的;


Havel-Hakimi定理:解决可读性判定

之后再排序:3 2 2 2 1

做一趟,排序一次;只要出现负数,就不可能了,图画不出来;最后全变成0,可以画;

Havel定理的解释——加加减减与图的对应关系_哔哩哔哩_bilibili


特别说明

若要用算法>贪心算法求解某问题的整体最优解,必须首先证明贪心思想在该问题的应用结果就是最优解!!

在使用算法>贪心算法解决问题时,必须首先证明贪心策略能够导致整体最优解。算法>贪心算法通常通过每一步选择局部最优解来构建全局解,但并非所有问题都适合使用算法>贪心算法,因此证明其正确性是关键。

说明理由:

若某货币系统有三种币值,分别为一角、五分和一分;要找1角5分
求最小找币数时,是否可以用贪心法求解?

可以;先用最大的能找几个找几个;

如果将这三种币值改为一种一分、五分和一分;要找1角5分

是否还可以使用贪心法求解?

不行;

因为他不成倍数;

算法>贪心算法的常见操作:

贪心总是要找最大的、最小的、最划算的,往往要排序;


http://www.niftyadmin.cn/n/5863411.html

相关文章

【HeadFirst系列之HeadFirstJava】第3天之从零开始理解Java中的主数据类型和引用

从零开始理解Java中的主数据类型和引用 《Head First Java》是一本非常适合初学者的Java入门书籍&#xff0c;它以轻松幽默的方式讲解了Java的核心概念。在第三章节中&#xff0c;书中详细介绍了Java的主数据类型&#xff08;Primitive Types&#xff09;和引用&#xff08;Re…

SpringBoot中实现限流和熔断功能

我们将使用Java的ScheduledExecutorService来实现一个简单的令牌桶算法(Token Bucket Algorithm),并结合一个自定义的服务类来处理第三方API调用。 1. 创建限流器 首先,创建一个简单的限流器类: import java.util.concurrent.*;public class SimpleRateLimiter {

计算机专业知识【数据库完整性约束:数据质量的坚固防线】

在数据库管理的领域中&#xff0c;数据的准确性、一致性和可靠性是至关重要的。为了保障这些特性&#xff0c;我们引入了各种完整性约束机制。接下来&#xff0c;就为大家详细介绍用户定义的完整性约束、实体完整性约束、参照完整性约束和关键字完整性约束&#xff0c;让数据库…

利用爬虫获取淘宝商品描述:实战案例指南

在电商领域&#xff0c;商品描述是消费者了解产品细节、做出购买决策的重要依据。精准获取淘宝商品描述不仅能帮助商家优化产品信息&#xff0c;还能为市场研究和数据分析提供丰富的数据资源。本文将详细介绍如何利用爬虫技术精准获取淘宝商品描述&#xff0c;并分享关键技术和…

2012年IMO几何预选题第6题

设有非等腰的 △ A B C \triangle ABC △ABC, O O O 和 I I I 分别为外心和内心. 在边 A C AC AC, A B AB AB 上分别存在两点 E E E 和 F F F, 使得 C D C E A B CDCEAB CDCEAB, B F B D A C BFBDAC BFBDAC. 设 ( B D F ) (BDF) (BDF) 和 ( C D E ) (CDE) (CDE)…

sklearn中的决策树

sklearn 中的决策树 关键概念、核心问题 节点 根节点&#xff1a;没有进边&#xff0c;有出边。包含最初的&#xff0c;针对特征的提问。中间节点&#xff1a;既有进边也有出边&#xff0c;进边只有一条&#xff0c;出边可以有很多条。都是针对特征的提问。叶子节点&#xff1…

mysql之规则优化器RBO

文章目录 MySQL 基于规则的优化 (RBO)&#xff1a;RBO 的核心思想&#xff1a;模式匹配与规则应用RBO 的主要优化规则查询重写 (Query Rewrite) / 查询转换 (Query Transformation)子查询优化 (Subquery Optimization) - RBO 的重中之重非相关子查询 (Non-Correlated Subquery)…

代码随想录-训练营-day35

309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 这个题比起我们的买卖股票二来说多了一个冷冻期的说法&#xff0c;也就是我们卖出股票的第二天无法买入股票。 这样对我们而言&#xff0c;dp数组的含义&#xff0c;或者说dp数组中的状态显然就不能是…