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

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl