✔ ★ 算法基础笔记(Acwing)(六)—— 贪心【java版本】

news2024/12/25 23:43:09

贪心

  • 一、 区间问题
        • 1. 区间选点
        • 2. 最大不相交区间数量
        • 3. 区间分组(用 堆top 代表区间 头头)
            • POJ3614Sunscreen(优先队列+贪心)
        • 4. 区间覆盖
  • 二、哈夫曼树
        • 1. 合并果子
  • 三、排序不等式
        • 1. 排队打水
  • 四、绝对值不等式
        • 货仓选址
  • 五、推公式
        • 耍杂技的牛

一、 区间问题

1. 区间选点

原题链接
原题链接
在这里插入图片描述

import java.util.*;
class Range implements Comparable<Range>{
    int l,r;
    public Range(int l,int r){
        this.l = l;
        this.r = r;
    }
    public int compareTo(Range o){
        return Integer.compare(r,o.r);
        //return this.r - o.r;
    }
}
public class Main{
    static int N = 100010,INF = 0x3f3f3f3f,n;
    static Range[] range = new Range[N];//结构体创建数组需要定义成全局变量
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);

        n = scan.nextInt();
        for(int i = 0 ; i < n ; i ++ ){
            int l = scan.nextInt();
            int r = scan.nextInt();
            range[i] = new Range(l,r);
        }
        //结构体排序
        Arrays.sort(range,0,n); 
        //Arrays.sort(range, 0, n, (o1, o2) -> o1.r - o2.r);

        int res = 0;//表示一共需要多少点
        int ed = -INF; // 上一个点的右端点
        for(int i = 0 ; i < n ; i ++ ){
            if(range[i].l > ed){
                res ++ ;
                ed = range[i].r;
            }
        }
        System.out.println(res);
    }
}
2. 最大不相交区间数量

原题链接
原题链接

import java.util.*;
class Range implements Comparable<Range>{
    int l,r;
    public Range(int l,int r){
        this.l = l;
        this.r = r;
    }
    public int compareTo(Range o){
        return Integer.compare(r,o.r);
        //return this.r - o.r;
    }
}
public class Main{
    static int N = 100010,INF = 0x3f3f3f3f,n;
    static Range[] range = new Range[N];//结构体创建数组需要定义成全局变量
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);

        n = scan.nextInt();
        for(int i = 0 ; i < n ; i ++ ){
            int l = scan.nextInt();
            int r = scan.nextInt();
            range[i] = new Range(l,r);
        }
        //结构体排序
        Arrays.sort(range,0,n); 
        //Arrays.sort(range, 0, n, (o1, o2) -> o1.r - o2.r);

        int res = 0;//表示一共需要多少点
        int ed = -INF; // 上一个点的右端点
        for(int i = 0 ; i < n ; i ++ ){
            if(range[i].l > ed){
                res ++ ;
                ed = range[i].r;
            }
        }
        System.out.println(res);
    }
}
3. 区间分组(用 堆top 代表区间 头头)

原题链接
原题链接

POJ3614Sunscreen(优先队列+贪心)

原题链接

import java.util.*;
class Range implements Comparable<Range>{
    int l,r;
    public Range(int l,int r){
        this.l = l;
        this.r = r;
    }
    public int compareTo(Range o){
        return Integer.compare(l,o.l);
    }
}
public class Main{
    static int N = 100010,n;
    static Range[] range = new Range[N];
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        for(int i = 0 ; i < n ; i ++ ){
            int l = scan.nextInt();
            int r = scan.nextInt();
            range[i] = new Range(l,r); 
        }

        Arrays.sort(range,0,n);

        PriorityQueue<Integer> minheap = new PriorityQueue<>(); // 小根堆
        for(int i = 0 ; i < n ; i ++ ){
            Range r = range[i];
            //小根堆的最小值要大于等于。因为相等也是有交点
            if(minheap.isEmpty() || minheap.peek() >= r.l) minheap.add(r.r);
            else{
                minheap.poll();
                minheap.add(r.r);
            }
        }
        System.out.println(minheap.size());
    }
}
4. 区间覆盖

原题链接
原题链接

import java.util.*;
class Range implements Comparable<Range>{
    int l,r;
    public Range(int l,int r){
        this.l = l;
        this.r = r;
    }
    public int compareTo(Range o){
        return Integer.compare(l,o.l);
    }
}
public class Main{
    static int N = 100010;
    static Range[] range = new Range[N];
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int st = scan.nextInt();
        int ed = scan.nextInt();
        int n = scan.nextInt();
        for(int i = 0 ; i < n ; i ++ ){
            int l = scan.nextInt();
            int r = scan.nextInt();
            range[i] = new Range(l,r);
        }
        Arrays.sort(range,0,n);

        int res = 0;//答案
        boolean success = false;//表示成功
        for(int i = 0 ; i < n ; i ++ ){ // 使用双指针算法,来查找每个 <= st的右端点最长的数
            int j = i;
            int end = (int)-(2e9);
            while(j < n && range[j].l <= st){ // 将所有左端点小于st的数的右端点进行比较,取出最大值
                end = Math.max(end,range[j].r);
                j ++ ;
            }

            if(end < st)  break; //如果右端点最大的点还小于st的话,就说明覆盖不完整,无解了break

            res ++; // 进行到这里就是有一个区间了 +1

            if(end >= ed){ // 如果进行到这一步完全覆盖了,就标记一下,然后break
                success = true;
                break;
            }
            st = end;//没选取一个区间,就将st赋值成这个区间的右端;
            i = j - 1; //然后将因为我们j是判断了所有的第一个可以选的区间,
                        //所以将这些都不用看了,直接从j开始看,i= j,因为是从0开始的,所以就赋值成j - 1
        }
        if(!success) res = -1; //如果没有标记就是说明没有完全覆盖,将结果复制成-1
        System.out.println(res);//最后输出res
    }
}

二、哈夫曼树

1. 合并果子

原题链接
原题链接
在这里插入图片描述

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int N = 10010;
        int n = scan.nextInt();
        Queue<Integer> minheap = new PriorityQueue<>();
        for(int i = 0 ; i < n ; i ++ ){
            int x = scan.nextInt();
            minheap.add(x);
        }
        int res = 0;
        for(int i = 0 ; i < n ; i ++ ){
            if(minheap.size() > 1){ // 为什么是大于1呢,如果剩余一组就说明是最后的结果了
                int a = minheap.poll(); // 将最小的数取出来后弹出
                int b = minheap.poll(); //将第二小的数取出来后弹出
                res += a + b;   // 将每一次两堆最小值相加之后的加过累加
                minheap.add(a + b);//然后将他放入到堆中
            }
        }
        System.out.println(res);
    }
}

三、排序不等式

1. 排队打水

原题链接
原题链接

import java.util.*;
public class Main{
    public static void main(String[] agrs){
        Scanner scan = new Scanner(System.in);
        int N = 100010;
        int[] w = new int[N];
        int n = scan.nextInt();
        for(int i = 0 ; i < n ; i ++ ){
            w[i] = scan.nextInt();
        }
        Arrays.sort(w,0,n);

        long res = 0;
        for(int i = 0 ; i < n ; i ++ ){
            res += w[i] * (n - i - 1);
        }

        System.out.println(res);
    }
}

四、绝对值不等式

货仓选址

原题链接
原题链接

import java.util.*;
public class Main{
    public static void main(String[] agrs){
        Scanner scan = new Scanner(System.in);
        int N = 100010;
        int[] a = new int[N];
        int n = scan.nextInt();
        for(int i = 0 ; i < n ; i ++ ){
            a[i] = scan.nextInt();
        }
        Arrays.sort(a,0,n);
        int sum = 0;
        for(int i = 0 ; i < n ; i ++ ){
            sum += Math.abs(a[i] - a[n / 2]); // Math.abs -- 求绝对值
        }
        System.out.println(sum);
    }
}

五、推公式

耍杂技的牛

原题链接
原题链接

import java.util.*;
class PII implements Comparable<PII>{
    int x,y;
    public PII(int x,int y){
        this.x = x;
        this.y = y;
    }
    public int compareTo(PII o){
        return Integer.compare(x,o.x);
    }
}
public class Main{
    static int N = 50010;
    static PII[] p = new PII[N];
    static int[] s = new int[N];
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        for(int i = 0 ; i < n ; i ++ ){
           int w = scan.nextInt();
           int s = scan.nextInt();
           p[i] = new PII(w + s,w); // 存入(体重+强壮值,体重)
        }

        Arrays.sort(p,0,n);

       int res = (int) -1e9;
       int sum = 0;
       for(int i = 0 ; i < n ; i ++ ){
           int w = p[i].y; // 体重
           int s = p[i].x - w; // 强壮值
           res = Math.max(res,sum - s); // 减去的是最下面的一个人的强壮值
           sum += w; //叠罗汉上去一个人就得叠加重量
       }
       System.out.println(res);
    }
}

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

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

相关文章

爬虫代理请求转换selenium添加带有账密的socks5代理

爬虫代理请求转换selenium添加带有账密的socks5代理。 一、安装三方库 二、使用方法 1、在cmd命令行输入&#xff1a; 2、给selenium添加代理 最近因为工作需要&#xff0c;需要selenium添加带有账密的socks5代理&#xff0c;贴出一个可用的方法。 把带有账密的socks5代理&am…

Xshell安装使用教程~

简介 Xshell 是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 Xshell可以在Windows界面下用来访问远端不…

iOS 视频压缩 mov转mp4 码率

最近还是因为IM模块的功能&#xff0c;IOS录制MOV视频发送后&#xff0c;安卓端无法播放&#xff0c;迫不得已兼容将MOV视频转为MP4发送。 其中mov视频包括4K/24FPS、4K/30FPS、4K/60FPS、720p HD/30FPS、1080p HD/30FPS、1080p HD/60FPS&#xff01; 使用AVAssetExportSessi…

14. Redisson 分布式锁

Spring Cloud 微服务系列文章&#xff0c;点击上方合集↑ 1. 开头 在单体应用中&#xff0c;我们可以用Java的synchronized或lock来使用锁&#xff0c;但在微服务的场景下&#xff0c;一个应用会部署多个实例&#xff0c;就需要保证多个实例的多个线程同时只能有一个线程来操…

破信息壁垒,亿发一站式ERP系统建设,打造五金制造信息管理平台

五金制造拥有明显的行业特征&#xff0c;如体量小、品种繁多、颜色多样、加工工艺不断演进等&#xff0c;呈现出一种独特的管理挑战。大多数五金企业仍然依赖人工管理和经验决策&#xff0c;如今需要寻求更合理和科学的决策方法&#xff0c;以实现生产、销售、仓储、采购和财务…

无人机如何做到自动巡检?关键技术步骤分析

无人机应用在电网、水利、交通、城管等巡逻巡检领域带来了巡视效率的提升。同时飞手操作的难度和门槛、野外环境的影响、巡检结果处理难度大等带来一系列的巡检问题&#xff0c;自动化的无人机巡检则能很好的解决这些问题&#xff0c;比如我们比较熟知的自动机场&#xff0c;它…

【DETR】

https://tianfeng.space/ 前言 论文 代码 DETR&#xff08;Data-efficient Image Transformer&#xff09;是一种用于目标检测任务的深度学习模型。它与传统的目标检测方法不同&#xff0c;采用了Transformer架构&#xff0c;将目标检测问题转化为一个序列到序列的问题。以下…

【广州华锐互动】VR消防队灭火实训:让消防安全教育变得更生动有趣!

VR消防队灭火实训是一种基于虚拟现实技术的消防培训及模拟&#xff0c;学习如何在火灾中保护自己的自救和逃生方法、技能。这种平台可以让市民在虚拟环境中进行火灾逃生训练&#xff0c;提高人的消防意识和自救能力。 传统的消防培训方式通常是通过理论讲解和现场演示来进行&am…

《论文阅读27》SuperGlue: Learning Feature Matching with Graph Neural Networks

一、论文 研究领域&#xff1a; 图像特征点匹配论文&#xff1a;SuperGlue: Learning Feature Matching with Graph Neural NetworksCVPR 2020veido论文code 二、论文简述 [参考] [参考] [参考] 三、论文详述 SuperGlue&#xff1a;使用图神经网络学习特征匹配 本文介绍了…

【AI视野·今日Sound 声学论文速览 第十一期】Mon, 25 Sep 2023

AI视野今日CS.Sound 声学论文速览 Mon, 25 Sep 2023 Totally 1 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Deepfake audio as a data augmentation technique for training automatic speech to text transcription models Authors Alexandre R. …

Hashable/哈希协议, Arrays/数组 的使用

1. Hashable 模型实现哈希协议 1.1 实现 /// Identifiable struct MyCustomModel: Hashable{//let id UUID().uuidStringlet title: Stringfunc hash(into hasher: inout Hasher) {hasher.combine(title)} }/// 哈希协议: 唯一标识值 struct HashableBootcamp: View {// 每个…

山西电力市场日前价格预测【2023-09-27】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-09-27&#xff09;山西电力市场全天平均日前电价为342.48元/MWh。其中&#xff0c;最高日前电价为454.24元/MWh&#xff0c;预计出现在18: 30。最低日前电价为171.32元/MWh&#xff0c;预计…

2023 年度编程语言榜单排名揭晓,Python稳坐多项第一

随着科技的迅速发展&#xff0c;编程语言已成为现代社会不可或缺的一部分&#xff1a; 无论是网站开发、移动应用、人工智能还是嵌入式系统&#xff0c;编程语言都扮演着关键角色。 当下流行的AI人工智能大多是通过Python语言实现的。 作为AI技术框架的基础语言&#xff0c;…

华为OD机试 - 工号不够用了怎么办 - 双指针(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

[CSCCTF 2019 Qual]FlaskLight 过滤 url_for globals 绕过globals过滤

目录 subprocess.Popen FILE warnings.catch_warnings site._Printer 这题很明显就是 SSTI了 源代码 我们试试看 {{7*7}} 然后我们就开始吧 原本我的想法是直接{{url_for.__globals__}} 但是回显是直接500 猜测过滤 我们正常来吧 {{"".__class__}} 查看当前…

项目经理如何顺利推进项目:做好任务规划,合理安排时间

在一个项目中&#xff0c;项目经理经常需面对超负荷的工作&#xff0c;并需要通过加班来达成每日的工作任务&#xff0c;他们时常需处理各种任务和大量的电子邮件。这导致项目经理在项目实施过程中&#xff0c;经常处于“救火”状态&#xff0c;而无法有效管理项目进程&#xf…

性能测试分类

一. 基准测试 二. 负载测试 通过逐步增加系统负载&#xff0c;测试系统性能的变化&#xff0c;在满足性能指标的前提下&#xff0c;系统所能承受的最大负载量的测试。 健身&#xff1a;举哑铃 10斤哑铃&#xff0c;举起10个需要15s 20斤哑铃&#xff0c;举起10个需要15s 30斤…

上海亚商投顾:沪指缩量调整 新型工业化板块掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日缩量震荡调整&#xff0c;创业板指再度跌破2000点关口。新型工业化板块掀涨停潮&#xff0c;华辰装备…

SourceTree 账号或者密码输入错误 Incorrect username or password ( access token )解决办法

修改来修改去一直解决不了&#xff0c;那就试试查看一下源文件记录的账号密码吧&#xff01;

聚势共赢!爱创科技喜获“腾讯健康年度优秀合作伙伴”!

2023年9月7日—8日&#xff0c;2023腾讯全球数字生态大会在深圳国际会展中心成功举办。来自行业的重磅院士学者、企业代表、生态伙伴等共赴大会&#xff0c;围绕“智变加速&#xff0c;产业焕新”这一活动主题进行了深层次、全方位的交流和探讨&#xff0c;共话大模型时代下数智…