算法奇妙屋(四十五)-CCPC备战之旅-1

文章目录

  • [2024秦皇岛-Problem C](#2024秦皇岛-Problem C)
    • [1. 题目解析](#1. 题目解析)
    • [2. 算法原理](#2. 算法原理)
    • [3. 代码](#3. 代码)

2024秦皇岛-Problem C

1. 题目解析

对于竞赛的题目相信我不用多说, 最最最重要的就是理解题意, 哪怕知道是坨屎也得吃掉

2. 算法原理

典型的区间贪心问题, 但在这里仍需排序+双指针+小根堆的辅助, 做这道题有很多收获
1. 竞赛Java的输入使用的是BufferedReader+StringTokenizer的组合,
① BufferedReader br = new BufferedReader(new InputStreamReader(System.in))实例化一个读入流

② StringTokenizer st = new StringTokenizer(br.readLine()) 用来读取一行, 即读取到回车/换行/回车+换行符号时停止, 这一行中可以包含其他空白字符
③ st.nextToken() 用来用来读取一个个token(单词), 每个token通过空白字符分割, 空白字符指的是空格 ()、制表符 (\t)、换行符 (\n)、回车符 (\r)、换页符 (\f)
2. 对于竞赛中的区间, 不一定采用二维数组来存储, 也可以使用两个数组来映射
3. 学到了两种种新的比较器使用方式

① Integer\[\] order数组要根据l\[\] 数组中的元素来进行升序排列,
Arrays.sort(order, Comparator.comparingInt(i -> li));

② 要进行降序排列, 将升序比较器反转即可
Arrays.sort(order, Comparator.comparingInt(i -> l(int) i).reversed());

③ 降序/升序的另一种方式, 通过Integer.compare方法
Arrays.sort(order, (a, b) -> Integer.compare(la, lb))


3. 代码

java 复制代码
package problem;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: ran
 * Date: 2026-04-15
 * Time: 0:30
 */
public class P_C {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()); // 读取第一行
        int n = Integer.parseInt(st.nextToken()); // 第一个token就是 n
        // 建立l和r数组
        int[] l = new int[n];
        int[] r = new int[n];
        Integer[] order = new Integer[n];
        // 读入到数组, 顺手初始化order
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            l[i] = Integer.parseInt(st.nextToken());
            r[i] = Integer.parseInt(st.nextToken());
            order[i] = i;
        }
        List<Integer> ret = new ArrayList<>();
        // 按照l的元素来, 来对order排序
        Arrays.sort(order, Comparator.comparingInt(i -> l[i]));
        // 按照r的元素来升序, 新学的排序方式
        PriorityQueue<Integer> heap = new PriorityQueue<>(Comparator.comparingInt(i -> r[i]));
        //外层循环
        int i = 0, p = 0;
        while (i < n || !heap.isEmpty()) {
            // 循环1
            while (i < n && l[order[i]] <= p) {
                heap.add(order[i]);// 把满足的坐标加入堆
                i++;
            }
            // 循环2
            boolean tag = false;
            while (!heap.isEmpty()) {
                int index = heap.poll();
                if (r[index] >= p) {
                    tag = true;
                    ret.add(index);
                    p++;
                    break;
                }
            }
            if (!tag) {
                break;
            }
        }
        System.out.println(ret.size());
        for (int x : ret) {
            System.out.print(x + 1 + " ");
        }
    }
}
相关推荐
Promising_GEO几秒前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析
大文说跨境6 分钟前
亚马逊多账号管理浏览器怎么选?云登/紫鸟/AdsPower 对比
java·前端·自动化
CoderYanger21 分钟前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
学电子她就能回来吗23 分钟前
LeetCode Hot 100|普通数组专题学习笔记(零基础版)
笔记·算法·leetcode
用户老李25 分钟前
反向传播计算梯度举例
算法
niyongsheng26 分钟前
多智能体连续时间内路径规划:AA-SIPP(m) 的 Rust 实现与算法
算法·rust·机器人
估值探索者35 分钟前
【Python量化选股流水线 #04】选股器好不好用?「昨日候选→今日表现」回看验收
开发语言·python·股票数据·股票数据api接口
顽疲42 分钟前
java springboot vue 养老系统源码详解:请假 care_leave 销假与床位停费日扣实践
java·vue.js·spring boot
XIAEE1 小时前
一个即时通讯项目是怎么长出来的:(Spring Boot 3 + Vue 3 微前端 + 悟空 IM + LiveKit)
java·spring
n87651 小时前
Playwright Java WEB UI 自动化实现框架与逻辑
java·前端·ui