PTA 活动选择问题 JAVA
输入格式:
第一行一个整数n(n≤1000);
接下来的n行,每行两个整数,第一个s**i,第二个是f**i(0<=s**i<f**i<=32767)。
输出格式:
输出最多能安排的活动个数。
输入样例:
11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13
结尾无空行
输出样例:
4
结尾无空行
样例解释:
安排的4个活动为1 4, 5 7, 8 11和12 14。
这题是比较经典的运用贪心算法可以做的题目,下述代码使用最早结束优先
代码:
1 import java.util.Scanner; 2 public class three{ 3 public static void main(String[] args){ 4 Scanner scan = new Scanner(System.in); 5 int n = scan.nextInt(); 6 int[][] s = new int[n][2]; 7 //因为每个活动都有开始时间,结束时间两个值所以设为2 8 for(int i = 0;i < n;i++){ 9 for(int j = 0;j < 2;j++)s[i][j] = scan.nextInt(); 10 } 11 Tools tool = new Tools(); 12 System.out.println("----------------------------------");//隔开输出内容 13 System.out.println("最大活动集为" + tool.MaxActivity(s)); 14 } 15 } 16 class Tools{ 17 public int MaxActivity(int[][] s){//选择最早结束时间 18 // 下面代码是将数组以结束时间从早到晚排序 19 if(n <= 1) return n; 20 for(int i = 0;i < s.length;i++){ 21 for(int j = i + 1;j < s.length;j++){ 22 if(s[j][1] < s[j - 1][1]){ 23 int[] swap = s[j]; 24 //因为交换的是二维数组,所以临时数是个一维数组 25 s[j] = s[j - 1]; 26 s[j - 1] = swap; 27 } 28 } 29 } 30 int sum = 1; 31 int t = 0; 32 //这里采用sum记录总活动数,t用来代表现在正在进行的活动 33 for(int i = 1;i < s.length ;i++){ 34 if(s[i][0] >= s[t][1]){ 35 //如果i活动开始时间>=正在进行活动的结束时间,就记录i活动 36 sum++; 37 t = i;//将i活动作为当前进行活动 38 } 39 } 40 return sum; 41 } 42 }

浙公网安备 33010602011771号