贪心法(二)—— 区间调度、区间选点

2024-03-09 02:58
文章标签 贪心 调度 区间 选点

本文主要是介绍贪心法(二)—— 区间调度、区间选点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 区间调度
    • 区间选点 POJ1201
    • 问题

区间调度

在这里插入图片描述
思路:
在这里插入图片描述
将结束时间按从小到大排序。要注意的是,每一项工作的开始时间与结束时间是一组,(不能分开排序)需要打包。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {public static void main(String[] args) {		                Scanner sc = new Scanner(System.in);int n = sc.nextInt();   int []s = new int[n];int []t = new int[n];Job[] jobs = new Job[n]; //创建Job类型把s与t打包for(int i=0;i<n;i++){s[i] = sc.nextInt();}for(int i=0;i<n;i++){t[i] = sc.nextInt();}for(int i=0;i<n;i++){jobs[i] = new Job(s[i],t[i]);}Arrays.sort(jobs);int res = f(n,jobs);System.out.println(res);   }private static int f(int n, Job[] jobs) {	int y = jobs[0].t;int res=1;for(int i=1;i<n;i++){if(jobs[i].s >= y){res++;y = jobs[i].t;}}return res;}private  static class Job implements Comparable<Job>{int s;int t;public Job(int s,int t){this.s=s;this.t = t;}public int compareTo(Job other) {int x = this.t - other.t;if(x==0) return this.t - other.t;elsereturn x;}	}
}

区间选点 POJ1201

在这里插入图片描述题目的大致意思是,给定n个闭区间,并且这个闭区间上的点都是整数,现在要求你使用最少的点来覆盖这些区间并且每个区间的覆盖的点的数量满足输入的要求点覆盖区间的数量。

输入:

第一行输入n,代表n个区间。

接下来的每行的第一个数代表区间起点,第二个数代表区间终点,第三个数代表这个区间必须要选取的点的数量。

输出:

输出最少的点的数量,这些最少的点要覆盖全部区间。

这里是引用
与区间调度类似,都是按照结束时间排序,都以结束时间为选取原则;
此题要使用一个数组来标识是否已选取,避免重复选取。

import java.util.Arrays;
import java.util.Scanner;
public class Main{public static void main(String[] args) {		                Scanner sc = new Scanner(System.in);int n = sc.nextInt();   Interval[] intervals = new Interval[n];//创建Interval类型把s,t与c打包for(int i=0;i<n;i++){intervals[i] = new Interval(sc.nextInt(),sc.nextInt(),sc.nextInt());}Arrays.sort(intervals);int max = intervals[n-1].t;int [] ans = new int[max+1]; //标识点是否被选中for(int i=0;i<n;i++){int s = intervals[i].s;int t = intervals[i].t;int c = intervals[i].c;int cnt = sum(ans,s,t);  //记录区间已标记点数量c-=cnt;   //还需标记点的个数while(c > 0){if(ans[t] == 0){ans[t] = 1;c--;t--;}else{t--;}} }System.out.println(sum(ans,intervals[0].s,max));}private static int sum(int[] ans, int s, int t) {int v = 0;for(int i = s;i <= t;i++){if(ans[i] == 1)v++;  }return v;}private  static class Interval implements Comparable<Interval>{int s;int t;int c;public Interval(int s,int t,int c){this.s = s;this.t = t;this.c = c;}public int compareTo(Interval other) {int x = this.t - other.t;if(x==0) return this.t - other.t;elsereturn x;}	}
}

问题

区间选点用上述方法会超时,可以用树状数组解决,后面补充。

这篇关于贪心法(二)—— 区间调度、区间选点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

usaco 1.3 Barn Repair(贪心)

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

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

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 :

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

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

ural 1820. Ural Steaks 贪心

1820. Ural Steaks Time limit: 0.5 second Memory limit: 64 MB After the personal contest, happy but hungry programmers dropped into the restaurant “Ural Steaks” and ordered  n specialty steaks