12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0
Sample Output
5
很基础的贪心算法,按照结束时间排序,再按顺序判断每个节目是否能看。
那么为何它可以用贪心算法?假设节目1具备最先完成时间,咱们须要证实问题的最优解中包含节目1,利用反证法,若是最优解中不包含节目1,那么咱们看的第一个节目的结束时间必定比节目1大,则咱们的最优解的第一个节目彻底能够用节目1代替,因此说,总存在以贪心选择开始的最优安排。另外,选择节目1后,原问题就简化成{全部节目 - 节目1}的最优安排问题,即该问题具备最优子结构性质。
综上,利用贪心算法能够得出最优方案。
import java.util.Scanner; class Play{ public int s = 0; public int e = 0; } public class Simple { public static void main(String[] args) { Scanner cin = new Scanner(System.in); Play []a = new Play[101]; while(cin.hasNext()){ int sum = 1; int n = cin.nextInt(); if(n == 0) break; for(int i = 1; i <= n; i++) { a[i] = new Play(); a[i].s = cin.nextInt(); a[i].e = cin.nextInt(); } for(int i = 1; i <= n; i++) { for(int j = i; j <= n; j++) { if(a[i].e > a[j].e) { Play t = new Play(); t = a[i]; a[i] = a[j]; a[j] = t; } if(a[i].e == a[j].e) { if(a[i].s < a[j].s) { Play t = new Play(); t = a[i]; a[i] = a[j]; a[j] = t; } } } } int result = greedy(n, sum, a); System.out.println(result); } cin.close(); } private static int greedy(int n, int sum, Play a[]) { // TODO Auto-generated method stub int j = 1; for(int i = 2; i <= n; i++) if(a[i].s >= a[j].e) { sum++; j = i; } return sum; } }
由于JAVA刚入门,C++也学的很差,致使代码总是有问题,仍是要多写。java
其中遇到的几个问题,第一,对每个数组对象都要new,其次,一开始写了一个方法想用来交换对象的值,发现没法交换,由于对象自己就是一个引用,不能像C++同样用指针交换。算法