当前位置:   article > 正文

贪心算法 --- 最小区间覆盖问题(POJ2376)

最小区间覆盖问题

POJ2376
题目的大概意思是农场主约翰有N条牛,这些牛可以在一天中的某个时间段进行工作,你的工作是帮助约翰分配一些奶牛轮班,这样
(i)每个轮班至少分配一头奶牛,以及
(ii)尽可能少的奶牛参与清洁。如果无法为每个班次分配奶牛,请打印-1

输入:
第一行两个数,第一个数代表牛的个数N,第二个数代表时间T,表示的是时间段[1,T]。
下面的N行每行表示牛工作的时间段。

输出:
输出使用最少的牛的数量。

思路分析:这道题目完全就是一个最小区间覆盖问题的裸题,求解过程,将每个牛工作的区间按左端点递增排序,如果左端点相同,按右端点递增顺序排列。设置start变量初始化为时间段的左端点,在这些区间中找到满足左端点小于start并且右端点尽量往右靠的区间,然后将这个区间的右端点设置为end变量,这样就找到了一个区间,然后将start变量更新为end变量,然后再在剩下的区间继续寻找左端点小于start并且右端点尽量往右靠的区间,然后再将这个区间的右端点设置为end变量,这样就又找到了一个区间,如此循环下去,直到end大于时间段的右端点,退出循环,这样就能找出使用哪些区间能够覆盖这个时间段了。解答这道题目在循环中使用一个变量计数即可。

贪心思想:要求用最少的区间进行覆盖,那么选取的区间必然要尽量长,而已覆盖到的区域之前的地方已经不用考虑了,可以理解成所有可覆盖的左端点都已被覆盖了,那么能够使得区间更长的取决于右端点,左端点没有太大的意义,所以选择右端点来覆盖。而且在循环的过程中,相当于很多的子问题最优组成了全局的最优。找到每个能够使用的最长区间就相当于子问题最优,而每个子问题最优就构成了使用的区间数最少这个全局最优。

 import java.util.Arrays;
 import java.util.Scanner;
 
 public class 最小区间覆盖问题 {
   
     public static void main(String[] args) {
   
         Scanner sc = new Scanner(System.in);
         int N = sc
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/856720?site
推荐阅读
相关标签
  

闽ICP备14008679号