贪心算法-整数区间-JAVA

贪心算法-整数区间

【题目描述】 

我们定义一个整数区间[a,b],a,b是一个从a开始至b 结束的连续整数的集合。编一个程序,对给定的 n个区间,找出满足下述条件的所含元素个数最少的集合中元素的个数:对于所给定的每一个区间,都至少有两个不同的整数属于该集合。(1<=n<=10000,  0<=a<=b<=1000)

输入输出格式:

输入:第一行一个正整数n,接下来有n行,每行给定一个区间的a,b值

输出:一个正整数,即满足条件的集合所包含的最少元素个数

输入输出样例

输入:           输出:

4                  4

3 6

2 4

0 2

4 7

【算法分析】

本题数据规模较大,用搜索做会超时,而动态规划无从下手。考虑贪心算法。题目意思是要找一个集合,该集合中的数的个数既要少又要和所给定的所有区间有交集。(每个区间至少有两个该集合中的数)。我们可以从所给的区间中选数,为了选尽量少的数,应该使所选的数和更多的区间有交集这就是贪心的标准。一开始将所有区间按照右端点从小到大排序。从第一个区间开始逐个向后检查,看所选出的数与所查看的区间有无交集,有两个则跳过,只有一个数相交,就从当前区间中选出最大的一个数(即右端点),若无交集,则从当前区间选出两个数,就(右端点,右端点-1),直至最后一个区间。

import java.util.Scanner;


public class Main {
	//贪心算法-整数区间
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int[] a = new int[N];//下限
		int[] b = new int[N];//上限
		int[] n = new int[1000];
		int output = 0;
		for (int i = 0; i < N ; i++) {
			a[i] = sc.nextInt();
			b[i] = sc.nextInt();
		}
		//按上限的大小,从小到大排序。
		for (int i = 0; i < N; i++) {
			for (int j = i+1; j < N; j++) {
				if(b[j]<b[i]){
					int temp = b[j];
					b[j] = b[i];
					b[i] = temp;
					temp = a[j];
					a[j] = a[i];
					a[i] = temp;
				}
			}
		}
		//从区间中取数,标记在n[]数组中。
		for (int i = 0; i < N; i++) {
			int flag = 0;//用于表示该区间内已经取了多少个数。
			for (int j = a[i]; j < b[i]+1; j++) {
				flag += n[j];
			}
			switch (flag) {
			case 0:
				n[b[i]-1] = 1;
				n[b[i]] = 1;
				break;
			case 1:
				n[b[i]] = 1;
				break;
			default:
				break;
			}
		}
		for (int i = 0; i < n.length; i++) {
			output += n[i];
		}
		System.out.println(output);
	}
}

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/u011035622/article/details/43638153
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞