8.4 贪心策略例题---区间选点问题

2024-02-18 08:58

本文主要是介绍8.4 贪心策略例题---区间选点问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

例题1:在区间内找尽可能少的点,能够命中所有区间

也是对开始和结束时间排序(结束时间从小到大排),每次选取结束时间点作为一个点,命中的区间数最大

如果选取一个区间的终点,命中了多个区间,接着再从未命中区间的终点开始选取点

例题2(在上题基础上的提高):要求每个区间有多个点

输入:

n(表示n个区间)

接下来n行输入 (每行三个数)

每个区间的开始时间 结束时间  含有点的个数

输出:

最少需要多少点

例如

输入:

输出:


import java.util.Arrays;
import java.util.Scanner;public class Main {/**思路:(1)首先将每个任务的开始时间、结束时间、需要包含的点封装在对象中,并按照结束时间递增排序(结束时间相同,按照开始时间递增排序)*    (2)依次遍历每一个区间*    	      查找该区间已存在的点*          如果已存在的点==其需要的点,则继续遍历下一个区间*          如果已存在的点<其需要的点,则从右向左为其分配点,并更新其所需的点,直到其所需的点为0*关键:判断某个点是否已存在:建立一个数组axs作为数轴,其范围1~所有任务中最晚的结束时间,如果位置i已经设点,将axs[i]=1*测试数据:
5
3 7 3
8 10 3
6 8 1
1 3 1
10 11 1*/public static void main(String[] args) {//(1)输入相关数据Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[][] a = new int[n][3];for(int i=0;i<n;i++) {a[i][0] = sc.nextInt();//开始时间a[i][1] = sc.nextInt();//结束时间a[i][2] = sc.nextInt();//需要的点数}//(2)将每个区间开始、结束时间、需要的点数封装起来,并排序Task[] task = new Task[n];for(int i=0;i<n;i++) {task[i] = new Task(a[i][0],a[i][1],a[i][2]);}//排序Arrays.sort(task);//(3)设置一个数组axs作为数轴,记录被占用的点。1表示被占用int max = task[n-1].e;//最后一个任务的结束时间是数轴中最大的点int[] axs = new int[max+1];//下标0~max//(4)依次遍历每个任务,为其加点for(int i=0;i<n;i++) {int start=task[i].s;int end=task[i].e;int sum = getSumPoint(start,end,axs);//获取当前区间已存在的点数while(sum<task[i].c) {//点数不足,继续从右向左加点.注意:是while循环if(axs[end]==0) {//最右端没有加点axs[end]=1;end--;sum++;}else {end--;}}}System.out.println(getSumPoint(1, max, axs));}//获取区间s~e中已存在的点数
private static int getSumPoint(int s, int e, int[] axs) {int cnt=0;for(int i=s;i<=e;i++) {cnt+=axs[i];}return cnt;
}}
class Task implements Comparable<Task>{int s;//开始时间int e;//结束时间int c;//需要的点数public Task(int s, int e, int c) {super();this.s = s;this.e = e;this.c = c;}@Overridepublic int compareTo(Task other) {int x = this.e-other.e;if(x==0) {//结束时间相等return this.s-other.s;}else {return x;}}}

 

 

这篇关于8.4 贪心策略例题---区间选点问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/720661

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模