活动选择

D14554. 活动选择

时间限制1.0s   内存限制256.0MB   代码提交间隔1分钟(现在可以提交)  

输入文件名:test.in   输出文件名:test.out

问题描述

  假设有一个需要使用某一资源的n个活动组成的集合S,S={1,…,n}。该资源一次只能被一个活动所占用,每一个活动有一个开始时间bi和结束时间ei(bi<=ei)。若bi>ej或者bj>ei,则活动兼容。
  你的任务是:选择由互相兼容的活动组成的最大集合中元素的个数。

输入格式

  共n+1行,其中第1行为n,第2行到第n+1行表示n个活动的开始时间和结束时间(中间用空格隔开),格式为:
  n
  b1 e1
  ……
  bn en
  (注:所有数据不超过整型)

输出格式

  一个整数,表示可以兼容活动的最大个数。

样例输入

11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13

样例输出

4

 

思路:

各个区间不能重叠。

贪心策略:

按照结束时间排序,记录当前最后结束时间,判断第i区间是否可以选中,若可以修改最大结束时间的值,ans+1,反之不理它。

证明:

当前有第一个区间和第i个区间,如若两者不冲突,都可以选中,自然能多选,反之第一个区间结束时间更早,影响后续选择的可能就小,如此必选靠前的区间。
实现时使用pair定义结构体,排序时可以默认优先级。

Code:

#include<bits/stdc++.h>

#define e first

#define b second

 

using namespace std;

 

int n, ans = 0;

pair <int, int> act[100010];

 

int main(){

       freopen("test.in","r",stdin);

       freopen("test.out","w",stdout);

       cin >> n;

       for (int i = 1; i <= n; i++)

              cin >> act[i].b >> act[i].e;

       sort(act + 1, act + n + 1);

       int last = 0;

       for (int i = 1; i <= n; i++) {

              if (act[i].b > last) {

                     ans++;

                     last = act[i].e;

              }/冲突性判断

       }

       cout << ans << endl;

       return 0;

}

 

转载于:https://www.cnblogs.com/sun915/p/9494077.html

活动选择问题是经典的动态规划问题,可以使用贪心算法或动态规划算法解决。下面给出一个使用动态规划算法解决活动选择问题的 Python 代码示例: ```python def max_activities(activities, start, finish): # 按结束时间排序 sorted_activities = sorted(zip(finish, activities)) n = len(activities) dp = [0] * n dp[0] = 1 for i in range(1, n): dp[i] = max(dp[j] for j in range(i) if sorted_activities[j][0] <= sorted_activities[i][1]) + 1 return dp[n-1] # 示例 activities = ['A', 'B', 'C', 'D', 'E', 'F'] start = [1, 3, 0, 5, 8, 5] finish = [2, 4, 6, 7, 9, 9] print(max_activities(activities, start, finish)) # 输出 4,即选择 A、B、D、F 这 4 个活动 ``` 在上面的代码中,`max_activities` 函数接受三个参数,分别是 `activities`、`start` 和 `finish`。其中,`activities` 是一个列表,表示各个活动的名称;`start` 是一个列表,表示各个活动的开始时间;`finish` 是一个列表,表示各个活动的结束时间。 在函数中,首先将所有活动按照结束时间排序,然后使用一个 `dp` 列表存储每个活动作为最后一个活动时,能够选择的最多活动数量。初始时,第一个活动的 `dp` 值为 1,然后从第二个活动开始遍历,对于每个活动,找到所有结束时间早于它的活动,计算它们的 `dp` 值,并取最大值加 1 就是当前活动的 `dp` 值。最终,`dp` 列表中的最大值即为能够选择的最多活动数量。 需要注意的是,上面的代码中并没有输出具体选哪些活动,如果需要输出具体解,可以再使用一些技巧进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值