备战蓝桥杯,用JAVA刷洛谷算法题单:【算法1-5】贪心

参考

【算法1-5】贪心 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

image-20240305094512555

题目

P2240 【深基12.例1】部分背包问题

这道题一开始0分,主要是浮点数精度问题、对list的大小判断防止越界

package _1_5;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

public class P2240 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int t = scanner.nextInt();
        ArrayList<Jinbi> list = new ArrayList<>();
        while (n-- > 0) {
            int m = scanner.nextInt();
            int v = scanner.nextInt();
            list.add(new Jinbi(m, v));
        }
        if (n == 0 || t == 0) System.out.printf("%.2f", 0);
        // algo 贪心:根据性价比排降序
        list.sort(new Comparator<Jinbi>() {
            @Override
            public int compare(Jinbi o1, Jinbi o2) {
                if (o1.mv > o2.mv) return -1;
                else if (o1.mv == o2.mv) {
                    return 0;
                } else return 1;
            }
        });
        // 按顺序装满背包
        double sum = 0;
        // !注意还要判断还有没有金币可取,否则越界
        while (t > 0 && list.size() > 0) {
            Jinbi jinbi = list.get(0);
            // 整个装得下
            if (jinbi.m <= t) {
                t -= jinbi.m;
                sum += jinbi.v;
                list.remove(0);
            } else {
                // 装不下,分割
                sum += jinbi.mv * t;
                break;
            }
        }
        System.out.printf("%.2f", sum);
        scanner.close();
    }
}

class Jinbi {
    double m;
    double v;
    double mv;

    // !注意在计算性价比的时候需要用浮点数计算得出浮点数,否则使用int计算得出的浮点数精度不准确
    // algo 浮点数精度:除法的比较可以转换成交叉相乘的比较
    // 即 o1.v/o1.m > o2.v/o2.m <-> o1.v*o2.m > o2.v*o1.m 这样也可以避免精度问题
    public Jinbi(double m, double v) {
        this.m = m;
        this.v = v;
        this.mv = v / m;
    }
}

P1803 凌乱的yyy / 线段覆盖

这道题我一开始想错了,按照了开始时间排序,应该按照结束时间排序

过了70%,剩余MLE

package _1_5;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

public class P1803 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = Integer.parseInt(scanner.nextLine());
        ArrayList<Bisai> list = new ArrayList<>();
        while (n-- > 0) {
            list.add(new Bisai(scanner.nextInt(), scanner.nextInt()));
        }
        // algo 贪心:按照结束时间升序排序
        // 越早结束后面才能进行更多
        list.sort((o1, o2) -> {
            if (o1.end == o2.end) {
                return (o1.end - o1.start) - (o2.end - o2.start);
            } else {
                return o1.end - o2.end;
            }
        });
        int count = 0;
        int time = 0;
        for (Bisai bisai : list) {
            if (bisai.start >= time) {
                time = bisai.end;
                count++;
            }
        }
        System.out.println(count);
        scanner.close();
    }
}

class Bisai {
    int start;
    int end;

    public Bisai(int start, int end) {
        this.start = start;
        this.end = end;
    }
}

P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G

原来Java有自带的堆排序,那没事了(不过还是回顾了以下堆的实现,总的来说就是建堆:插入元素并且上浮;取元素:堆顶和最后一个元素交换并且下沉)

PriorityQueue优先队列

  • 可以使用自定义类,但是要实现Comparable接口的compareTo方法;或者创建queue的时候传入Comparator的实现类。
  • 默认小根堆,按顺序取值的话得到的是升序。
  • 例如Integer包装类的compare是写死的,所以要实现Comparator
package _1_5;

import java.util.*;

public class P1090 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        // algo 堆排序/优先队列:https://blog.csdn.net/m0_56361048/article/details/127950384
        PriorityQueue<Long> heap = new PriorityQueue<>();
        while (n-- > 0) {
            heap.offer((long) scanner.nextInt());
        }
        long count = 0;
        while (heap.size() >= 2) {
            Long a = heap.poll();
            Long b = heap.poll();
            Long c = a + b;
            count += c;
            heap.offer(c);
        }
        System.out.println(count);
        scanner.close();
    }
}

eap.poll();
Long c = a + b;
count += c;
heap.offer©;
}
System.out.println(count);
scanner.close();
}
}


  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蓝桥杯是中国著名的计算机竞赛,其中包含了多个不同的竞赛项目,其中也包括了Python真题。 Python真题是指在比赛中需要使用Python编程语言完成的题目。通常这些题目旨在考察参赛者对Python语法、基本数据结构和算法的理解与掌握。 在Python真题中,常见的题型包括但不限于以下几种: 1. 简单的输出题:要求参赛者编写Python代码,输出指定的结果。这类题目主要考察对基本语法的掌握和对输出格式的处理能力。 2. 数据处理题:给出一定规模的数据,要求参赛者编写Python代码进行相应的数据处理和运算。这类题目主要考察对Python基本数据结构(如列表、字典、字符串等)和控制流程(如循环、条件判断等)的掌握。 3. 算法设计题:给出一定的问题描述,要求参赛者设计一个Python函数或类来解决该问题。这类题目主要考察对算法的理解与应用能力,包括对递归、动态规划、贪心算法等常见算法思想的应用。 完成Python真题需要参赛者具备一定的编程基础和对Python语言的熟悉程度。因此,在备战蓝桥杯的过程中,建议参赛者通过题、练习和项目实践等方式提升编程能力,并深入学习Python语言的特性和常用库的使用。同时,了解和掌握各类常见的算法思想和数据结构,对于解决复杂的Python真题问题很有帮助。 总之,通过积极学习和不断练习,参赛者可以在蓝桥杯Python真题中展示自己的编程实力,并提升自己在计算机科学领域的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值