每日OJ题_牛客_AB31活动安排_区间贪心_C++_Java

目录

牛客_AB31活动安排_区间贪心

题目解析

C++代码

Java代码


牛客_AB31活动安排_区间贪心

活动安排_牛客题霸_牛客网

描述:

        给定n个活动,每个活动安排的时间为[ai,bi)。求最多可以选择多少个活动,满足选择的活动时间两两之间没有重合。

输入描述:

第一行输入一个整数nn (1≤n≤2⋅10^5),表示可选活动个数。
接下来的n行,每行输入两个整数ai,bi (0≤ai<bi≤10^9),表示第i个活动的时间。

输出描述:

输出一行一个整数,表示最多可选择的活动数。


题目解析

区间问题的贪心:排序,然后分情况讨论,看看是合并还是求交集。

C++代码

#include <asm-generic/errno.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#define int long long
signed main()
{
    int n = 0;
    cin >> n;
    vector<vector<int>> arr(n, vector<int>(2));
    int maxTime = 0;
    for(int i = 0; i < n; ++i)
    {
        cin >> arr[i][0] >> arr[i][1];
        maxTime += arr[i][1];
    }
    auto cmp = [=](vector<int> arr1, vector<int> arr2)
    {
        if(arr1[0] < arr2[0])
            return true;
        else if(arr1[0] == arr2[0] && arr1[1] < arr2[1])
            return true;
        return false;
    };
    // sort(arr.begin(), arr.end(), cmp);
    sort(arr.begin(), arr.end()); // 不用自己写排序?确实,脑子瓦特了
    // for(int i = 0; i < n; ++i)
    // {
    //     cout << arr[i][0] << " " << arr[i][1] << endl;
    // }
    int res = 1;
    int last = arr[0][1];
    for(int i = 1; i < n; ++i)
    {
        if(arr[i][0] >= last) // 没有重叠
        {
            ++res;
            last = arr[i][1];
        }
        else // 有重叠 // 容易少这一句!!!!!!
        {
            last = min(last, arr[i][1]);
        }
    }
    cout << res << endl;
    // sort(arr.begin(), arr.end());

    // vector<vector<int>> dp(n + 1, vector<int>(maxTime));
    // // dp[i][j] 表示从1到i中选,活动时间不超过j的活动数?
    // int res = 0;
    // for(int i = 2; i <= n; ++i)
    // {
    //     for(int j = 0; j <= maxTime; ++j)
    //     {
    //         dp[i][j] = dp[i - 1][j]; // 不选
    //         if(j >= arr[i][1] && arr[i][0] >= arr[i - 1][1])
    //         {
    //             dp[i][j] = max(dp[i][j], dp[i][j - arr[i][1]] + 1); // 选
    //         }
    //         res = max(res, dp[i][j]);
    //     }
    // }
    // // cout << res << endl;
    // cout << 2 << endl;
    return 0;
}

Java代码

import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{
    public static void main(String[] args) 
    {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[][] arr = new int[n][2];
        for(int i = 0; i < n; i++)
        {
            arr[i][0] = in.nextInt();
            arr[i][1] = in.nextInt();
        }
        Arrays.sort(arr, (a, b) -> {
            return a[0] <= b[0] ? -1 : 1;
        });
        int ret = 0, r = arr[0][1];
        for(int i = 1; i < n; i++)
        {
            if(arr[i][0] < r) // 有重叠
            {
                r = Math.min(r, arr[i][1]);
            }
            else // 没有重叠
            {
                ret++;
                r = arr[i][1];
            }
        }
        System.out.println(ret + 1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GR鲸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值