区间调度问题(贪心)

2023-05-06 16:34:14 浏览数 (2)

代码语言:javascript复制
/*区间调度问题
 * 有n项工作,每项工作分别在si时间开始,在ti时间结束。对于每项工作,你都可以选择参加与否。
 * 如果选择了参加,那么自始至终都必须全程参加。此外,参加工作的时间段不能重叠(即使是开始的瞬间
 * 和结束的瞬间的重叠也是不允许的)。
 * 你的目标是参与尽可能多的工作,那么最多能参与多少项工作呢?
 * 限制条件:
 * 1≤N≤100000
 * 1≤si≤ti≤10的9次方
 * */

import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
import java.util.Vector;

public class IntervalScheduling
{
	public static int[] E = new int[100000];
	public static int[] S = new int[100000];
	public static int[] route = new int[100000];
	public static class Point
	{
		public int start, end;
		Point(int start, int end)
		{
			this.start = start;
			this.end = end;
		}
	}
	public static void main(String[] args)
	{
		Vector<Point> v = new Vector<Point>();
		Scanner cin  = new Scanner(System.in);
		int n = cin.nextInt();
		for (int i = 0; i < n;   i)
		{
			S[i] = cin.nextInt();
		}
		for (int i = 0; i < n;   i)
		{
			E[i] = cin.nextInt();
		}
		cin.close();
		for (int i = 0; i < n;   i)
		{
			v.add(new Point(S[i], E[i]));
		}
		Collections.sort(v, new Comparator<Point>(){
					public int compare(Point o1, Point o2)
					{
						return o1.end - o2.end;
					}
				});//升序排列,若降序交换即可(默认升序)
		int ans = 0, time = 0, j = 0;
		for (int i = 0; i < n;   i)
		{
			Point p = v.get(i);
			if (time < p.start)
			{
				  ans;
				route[  j] = i   1;//记录第几件工作
				time = p.end;
			}
		}
		System.out.println(ans   "件");
		System.out.print("选取工作 ");
		for (int i = 1; i <= j;   i)
		{
			System.out.print(route[i]  " ");
		}
		System.out.println();
	}
}

0 人点赞