1254: 活动安排

1254: 活动安排

时间限制: 1 Sec  内存限制: 128 MB
提交: 1461  解决: 779
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

有n份兼职,每份兼职有一个开始时间和一个结束时间,假设你的空闲时间为从1到m,假如你的休息时间可以忽略,
请你选择若干份兼职(每次只能做其中一个兼职),使你在该段空闲时间内完成的兼职份数最大。

输入

第一行为两个整数n,m分别表示n份兼职,空闲时间为1到m(1<=n<=1e4,1<=m<=1e5)。
接下来n行每行有2个整数a,b。表示该兼职开始和结束时间(1<=a<=b<=m)。

输出

输出你在1到m时间段内最多能完成几份兼职。

样例输入 Copy
4 10
1 3 
2 4 
5 7 
9 10
样例输出 Copy
3
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.Comparator;
  
  
public class Main {
    static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
      
    public static void main(String[] args) {
        int n = nextInt();
        int m = nextInt();
        int[][] A = new int[n][2];  // A[i][0]代表活动i的开始时间,A[i][1]代表结束时间
         
        for (int i = 0; i < n; i++) {
            A[i][0] = nextInt();
            A[i][1] = nextInt();
        }
        // 重写比较器,按照结束时间升序
        Arrays.sort(A, new Comparator<int []>() {
             public int compare(int[] a, int[] b) {
                return a[1] - b[1];
            }
        });
        
        int cnt = 1;  // 活动数
        int j = 0;  // 当前活动的 下标
        // 当下一个活动
        for (int i = 1; i < n; i++) {
            if (A[i][0] >= A[j][1]) {
                cnt++;
                j = i;
            }
        }
        System.out.println(cnt);
          
    }
      
    static int nextInt() {
        try {
            in.nextToken();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return (int)in.nval;
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值