PTA 活动选择问题 JAVA

假定一个有n个活动(activity)的集合S={a1,a2,....,an},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用。每个活动ai都有一个开始时间si和一个结束时间fi,其中0<=si<fi<=32767。如果被选中,任务ai发生在半开时间区间[si,fi)期间。如果两个活动aiaj满足[si,fi)和[sj,fj)不重叠,则称它们是兼容的。也就说,若si>=fjsj>=fi,则aiaj是兼容的。在活动选择问题中,我们希望选出一个最大兼容活动集。

输入格式:

第一行一个整数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 }

 

 

 

posted @ 2021-12-28 21:38  Imepeto  阅读(130)  评论(0)    收藏  举报