【算法】反悔贪心

这篇具有很好参考价值的文章主要介绍了【算法】反悔贪心。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

反悔贪心

思路是无论当前的选项是否最优都接受,然后进行比较,如果选择之后不是最优了,则反悔,舍弃掉这个选项;否则,正式接受。如此往复。

力扣题目列表

630. 课程表 III

https://leetcode.cn/problems/course-schedule-iii/description/?envType=daily-question&envId=2023-09-11

【算法】反悔贪心,算法,算法,反悔贪心,贪心

提示:
1 <= courses.length <= 104
1 <= durationi, lastDayi <= 104

解法看注释就很清楚了。
【算法】反悔贪心,算法,算法,反悔贪心,贪心

class Solution {
    public int scheduleCourse(int[][] courses) {
        // 按照截止时间从小到大排序
        Arrays.sort(courses, (a, b) -> a[1] - b[1]);
        // 最大堆
        PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);
        int day = 0;        // 记录当前使用了多少天
        for (int[] c: courses) {
            int d = c[0], t = c[1];
            if (day + d <= t) {
                // 如果可以学,直接学
                day += d;
                pq.offer(d);
            } else if (!pq.isEmpty() && pq.peek() > d) {
                // 如果不可以学,检查已经选了的课程中有没有耗时更长的替换掉
                day -= pq.poll() - d;
                pq.offer(d);
            }
        }
        // 最后的答案就是队列中已选课程的数量
        return pq.size();
    }
}

871. 最低加油次数

https://leetcode.cn/problems/minimum-number-of-refueling-stops/

【算法】反悔贪心,算法,算法,反悔贪心,贪心
提示:
1 <= target, startFuel <= 10^9
0 <= stations.length <= 500
1 <= positioni < positioni+1 < target
1 <= fueli < 10^9

按照加油站的出现顺序排序。
用堆维护目前可以加的油,每次路过一个加油站先不加而是放入优先队列中,等到走不动了再一个个从大到小加油。

class Solution {
    public int minRefuelStops(int target, int startFuel, int[][] stations) {
        // 按照出现顺序排序
        Arrays.sort(stations, (a, b) -> a[0] - b[0]);
        PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);
        int ans = 0, pos = startFuel;
        for (int[] s: stations) {
            if (pos >= target) return ans;
            int p = s[0], f = s[1];
            while (pos < p && !pq.isEmpty()) {
                pos += pq.poll();
                ans++;
            }
            if (pos < p) return -1;
            else pq.offer(f);
        }
        while (pos < target && !pq.isEmpty()) {
            pos += pq.poll();
            ans++;
        }
        return pos < target? -1: ans;
    }
}

LCP 30. 魔塔游戏

https://leetcode.cn/problems/p0NxJO/
【算法】反悔贪心,算法,算法,反悔贪心,贪心

提示:
1 <= nums.length <= 10^5
-10^5 <= nums[i] <= 10^5

先检查是否可以访问完全部房间,如果不可以直接返回-1。
如果不可以,每次遇到负数先放入优先队列中去,当血量不够时,再依次从小到大取出堆中的负数调换到队尾。

class Solution {
    public int magicTower(int[] nums) {
        if (Arrays.stream(nums).sum() < 0) return -1;
        int ans = 0;
        // pq中存放目前遇到的负数
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        long s = 1;
        for (int x: nums) {
            s += x;
            if (x < 0) pq.offer(x);
            while (s <= 0) {
                // 每次把最小的移动到最后面去
                s -= pq.poll();
                ans++;
            }
        }
        return ans;
    }
}

2813. 子序列最大优雅度

https://leetcode.cn/problems/maximum-elegance-of-a-k-length-subsequence/description/

【算法】反悔贪心,算法,算法,反悔贪心,贪心

提示:
1 <= items.length == n <= 10^5
items[i].length == 2
items[i][0] == profiti
items[i][1] == categoryi
1 <= profiti <= 10^9
1 <= categoryi <= n
1 <= k <= n

按照利润从大到小排序。
i < k 时直接加入,如果有重复的类别就将当前元素放入栈中(因为是从大到小枚举,所以栈顶一定是利润最小的)
当 i > k 时,如果当前元素还没有出现过,就可以尝试替换掉重复类型中利润最小的元素。

class Solution {
    public long findMaximumElegance(int[][] items, int k) {
        // 按利润从大到小排序
        Arrays.sort(items, (a, b) -> b[0] - a[0]);
        long ans = 0, totalProfit = 0;
        Set<Integer> s = new HashSet<>();
        Deque<Integer> stk = new ArrayDeque<>();
        for (int i = 0; i < items.length; ++i) {
            int p = items[i][0], c = items[i][1];
            if (i < k) {
                totalProfit += p;
                if (s.contains(c)) stk.push(p);
                s.add(c);
            } else if (!stk.isEmpty() && !s.contains(c)) {
                totalProfit -= stk.pop() - p;
                s.add(c);
            }
            ans = Math.max(ans, totalProfit + (long)s.size() * s.size());
        }

        return ans;
    }
}

注意代码中的 s.add(c); 不能提出 if-else 之外,否则会影响答案。

洛谷题目列表

P2949 [USACO09OPEN] Work Scheduling G

https://www.luogu.com.cn/problem/P2949
【算法】反悔贪心,算法,算法,反悔贪心,贪心

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] g = new int[n][2];
        for (int i = 0; i < n; ++i) {
            g[i][0] = sc.nextInt();
            g[i][1] = sc.nextInt();
        }
        // 按照截止时间从小到大排序
        Arrays.sort(g, (a, b) -> a[0] - b[0]);
        long ans = 0;
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for (int[] p: g) {
            // 如果当前工作不超时  加入答案和优先队列中
            if (pq.size() < p[0]) {
                pq.offer(p[1]);
                ans += p[1];
            } else if (!pq.isEmpty() && p[1] > pq.peek()) {
                // 当前工作超时 和已经选了的工作中最小的交换
                ans += p[1] - pq.poll();
                pq.offer(p[1]);
            }
        }
        System.out.println(ans);
    }
}

P1209 [USACO1.3] 修理牛棚 Barn Repair

https://www.luogu.com.cn/problem/P1209

【算法】反悔贪心,算法,算法,反悔贪心,贪心
【算法】反悔贪心,算法,算法,反悔贪心,贪心

记得要对输入数据排序!

import java.io.BufferedInputStream;
import java.lang.reflect.Array;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sin = new Scanner(new BufferedInputStream(System.in));
        int m = sin.nextInt(), s = sin.nextInt(), c = sin.nextInt();
        PriorityQueue<Long> pq = new PriorityQueue<>();
        int[] a = new int[c];
        long last = -1, ans = c;
        m--;
        for (int i = 0; i < c; ++i) {
            a[i] = sin.nextInt();
        }
        Arrays.sort(a);
        for (int i = 0; i < c; ++i) {
            int p = a[i];
            if (last != -1 && last < p - 1) {
                pq.add(p - last - 1);
                m--;
            }
            last = p;
        }
        while (m < 0 && !pq.isEmpty()) {
            m++;
            ans += pq.poll();
        }
        System.out.println(ans);
    }
}

每次将空格记录在优先队列中,当木板数量不够时,从小到大取出优先队列中的空格依次填上。

P2123 皇后游戏(🚹省选/NOI− TODO)

https://www.luogu.com.cn/problem/P2123
【算法】反悔贪心,算法,算法,反悔贪心,贪心
【算法】反悔贪心,算法,算法,反悔贪心,贪心
【算法】反悔贪心,算法,算法,反悔贪心,贪心

在这里插入代码片

相关链接

【力扣周赛】第 357 场周赛(⭐反悔贪心)文章来源地址https://www.toymoban.com/news/detail-707628.html

到了这里,关于【算法】反悔贪心的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法】贪心算法练习一

    个人主页 : zxctscl 如有转载请先通知 一、贪心策略:解决问题的策略,局部最优-全局最优 把解决问题的过程分为若干步; 解决每一步的时候,都选择当前看起来“最优的”解法; 希望得到全局最优。 二、贪心策略的正确性 因为有可能“贪心策略”是一个错误的方法 正确

    2024年04月25日
    浏览(71)
  • 贪心算法part01 算法

    ● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和 https://leetcode.cn/problems/assign-cookies/description/ https://leetcode.cn/problems/wiggle-subsequence/description/ https://leetcode.cn/problems/maximum-subarray/description/

    2024年02月02日
    浏览(41)
  • 算法之贪心算法

    定义 总是做出当前最好的选择,期望通过局部最优选择得到全局最优的解决方案。 适用标准 贪心选择性质。 原问题的整体最优解可以通过一系列局部最优的选择得到。这种选择依赖于已做出的选择,不依赖于未做出的选择。贪心算法解决的问题,在程序运行过程中无回溯过

    2024年02月08日
    浏览(34)
  • 18. 算法之贪心算法

    贪心算法(greedy algorithm,又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。下面,我们详细介绍。 贪婪算法(Greedy)的定义: 是一种在每一步选中都采取在当前状态

    2024年02月09日
    浏览(34)
  • 算法小课堂(五)贪心算法

    贪心算法是一种常见的算法思想,用于解决优化问题。其基本思想是在每一步选择中都采取当前状态下最优的选择,从而希望能够获得全局最优解。 具体来说,贪心算法通常分为以下步骤: 定义问题的最优解,通常需要将问题转化为求最大值或最小值; 选择一个局部最优解

    2024年02月02日
    浏览(41)
  • C++算法之贪心算法

    贪心算法是一种求解最优解问题的算法,它的核心思想是每一步都采取当前状态下最优的选择,从而最终得到全局最优解。它是C++重要的一种算法。下面会介绍贪心算法。 目录 1.步骤 1.2 例 2.框架 3.例题 3.1 删数问题 13  3.2 接水问题 (1)确定问题的最优子结构:问题的最优

    2024年01月21日
    浏览(42)
  • 贪心算法(贪婪算法)

    贪心算法(贪婪算法) 贪心算法思想 ​ 1.贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说, 不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解 。 ​ 2.贪心选择是指所求问题的 整体最优解可以通过一系列局部

    2024年02月03日
    浏览(45)
  • 算法设计方法之贪心算法

    贪心算法是算法设计的一种方法。期盼通过每个阶段的局部最优选择,从而达到全局的最优。但结果不一定是最优的。 场景一 零钱兑换 现有硬币 1 元、2 元、5 元,需要用最少的硬币数量凑够 11 元。 利用贪心算法实现,优先考虑最好的结果就是面值为 5 元的硬币,11 = 5 +

    2024年02月17日
    浏览(43)
  • 初级算法-贪心算法

    主要记录算法和数据结构学习笔记,新的一年更上一层楼! 贪心算法 本质找到每个阶段的局部最优,从而推导全局最优 1. 题目 :假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让

    2024年02月03日
    浏览(29)
  • 算法-贪心算法

    题目:给定一个字符串str,只由‘X’和‘.’两种字符构成。‘X’表示墙,不能放灯,也不需要点亮‘.’表示居民点,可以放灯,需要点亮如果灯放在i位置,可以让i-1,i和i+1三个位置被点亮返回如果点亮str中所有需要点亮的位置,至少需要几盏灯 思路:递归方式,每个位置

    2024年02月21日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包