贪心算法经典例题:
暂时不知道贪心算法的概念,以后补上,先更新一道例题吧!
确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)
贪心解法的经典题目:
问题可以化简为:
在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分,问最大的k为多少。
最左边的线段放什么最好?
显然放右端点最靠左的线段最好,从左向右放,右端点越小妨碍越少
其他线段放置按右端点排序,贪心放置线段,即能放就放
举例:
2 10
3 4
4 5
5 6
因为不管其他相交,至少可以看一场,可以以这一场为基础,往上添加场数,所以问题转换成当第一场是什么时,场数最多,当第一场是 2 10 时可以看到,时间将剩下三场全部覆盖,所以,不行,要将右端点最小的放在第一场的位置上,这样阻碍其他场数的也就越小,然后将结束时间排序,依次往上添加,能填则填
全部代码:
import java.math.BigDecimal;
import java.util.*;
public class Main {
static int dx[] = { -1, -1 };
static int dy[] = { 1, -1 };
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
if(n==0) {
break;
}
int[][] arr = new int[n][2];
int[][] arrk = new int[n][2];
boolean[]b = new boolean[1000010];
for (int i = 0; i < arr.length; i++) {
arr[i][0] = sc.nextInt();
arr[i][1] = sc.nextInt();
}
for (int i = 0; i <arr.length; i++) {
for (int j = 0; j < arr.length-i-1; j++) {
if(arr[j+1][1]<arr[j][1]) {
int temp = arr[j+1][1];
arr[j+1][1]=arr[j][1];
arr[j][1]=temp;
int temp2 = arr[j+1][0];
arr[j+1][0]=arr[j][0];
arr[j][0]=temp2;
}
}
}
int sum = 1;
int end = arr[0][1];
for (int i = 1; i < arr.length; i++) {
if (arr[i][0] >= end) {
sum++;
end = arr[i][1];
}
}
System.out.println(sum);
}
}
}