【题目链接】

ybt 1323:【例6.5】活动选择
ybt 1422:【例题1】活动安排
洛谷 P1803 凌乱的yyy / 线段覆盖
注意:ybt 1323数据个数最大为 1 0 3 10^3 103, 洛谷P1803数据个数最大为 1 0 6 10^6 106

【题目考点】

1. 贪心

2. 贪心选择性质的证明

要想证明贪心选择可以得到最优解,只需要证明最优解包含每一次的贪心选择。
使用数学归纳法:

  1. 证明最优解包含第一次的贪心选择
  2. 假设存在最优解包含前k次的贪心选择,证明该最优解包含第k+1次的贪心选择

【解题思路】

解法1:选择结束时间最早的活动

1. 贪心选择性质的证明:

贪心选择:每次选择不与已选择活动重叠的结束时间最早的活动

  1. 证明:存在最优的活动选择方案包含第一次贪心选择:结束时间最早的活动g

使用反证法:假设所有最优解都不包含结束时间最早的活动g
对于某一最优解,活动序列按结束时间排序为: a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1​,a2​,...,an​,显然其中没有活动g。如果将活动 g g g替换活动 a 1 a_1 a1​,由于 g g g的结束时间比 a 1 a_1 a1​早,不会与后面的活动发生重叠。活动选择方案为 g , a 2 , a 3 , . . . , a n g, a_2,a_3, ..., a_n g,a2​,a3​,...,an​,该方案中的活动数量与先前的方案的活动数量相同。先前的方案是活动数量最多的最优解,那么这个方案也是最优解,而这个方案中包含了活动g,这与假设相悖。因而原命题得证。

  1. 证明:在k次贪心选择后,存在最优的活动选择方案包含第k+1次的贪心选择:不与前面重叠的结束时间最早的活动g。

使用反证法:假设所有最优解都不包含活动g
对于某一最优解,活动序列按结束时间排序为: a 1 , a 2 , . . . , a k , a k + 1 , a k + 2 , . . . , a n a_1,a_2,...,a_k,a_{k+1}, a_{k+2}, ..., a_n a1​,a2​,...,ak​,ak+1​,ak+2​,...,an​,前k个活动是通过贪心选择得到的。
根据活动g的定义,活动g的结束时间一定早于活动 a k + 1 a_{k+1} ak+1​的结束时间,而且不与 a k a_k ak​重叠。
如果用活动g替换活动 a k + 1 a_{k+1} ak+1​,那么活动方案 a 1 , a 2 , . . . , a k , g , a k + 2 , . . . , a n a_1,a_2,...,a_k, g, a_{k+2}, ..., a_n a1​,a2​,...,ak​,g,ak+2​,...,an​的活动数量与原方案是一样的,原方案是活动数量最多的最优解,替换后的方案同样也是最优解,其中包含活动g,这与假设相悖。因而原命题得证。

2. 具体做法

用结构体对象存储各个活动的开始和结束时间。按活动的结束时间对活动进行升序排序。顺序取各个活动,只要该活动与前一个选择的活动不重叠(即该活动的起始时间不早于已经选择的最后一个活动的结束时间),那么就选择该活动。统计活动数量。

解法2:选择开始时间最晚的活动

贪心选择:每次选择不与已选择活动重叠的开始时间最晚的活动
其正面方法与解法1中的类似,不再赘述。
具体做法:
按开始时间对活动进行降序排序。顺序取各个活动,只要当前活动的结束时间不晚于已经选择的最后一个活动的开始时间,那么就选择该活动。统计活动数量。

【题解代码】

解法1:选择结束时间最早的活动

注意:ybt 1323中,数组长度N可以设为1005, 洛谷P1803数组长度N必须设为1000005

#include<bits/stdc++.h>
using namespace std;
#define N 1000005
int b[N], e[N];
struct Act
{int begin, end;
};
Act act[N];
bool cmp(Act a, Act b)
{return a.end < b.end;
}
int main()
{int n, actNum = 0, lastAct = 0;//lastAct:当前已经选择的活动中最后一个活动 scanf("%d", &n);for(int i = 1; i <= n; ++i)scanf("%d %d", &act[i].begin, &act[i].end);sort(act+1, act+1+n, cmp);//按照结束时间从小到大排序 for(int i = 1; i <= n; ++i){if(lastAct == 0 || act[i].begin >= act[lastAct].end)//如果第i个活动在当前最后的活动后面开始 {actNum++;//选择第i活动 活动数量加1 lastAct = i;}}printf("%d", actNum);return 0;
}

解法2:选择开始时间最晚的活动

#include<bits/stdc++.h>
using namespace std;
#define N 1000005
struct Act
{int begin, end;
};
Act act[N];
bool cmp(Act a, Act b)
{return a.begin > b.begin;
}
int main()
{int n, actNum = 0, lastAct = 0;//edNow:当前已经选择的活动的最后截止时间 scanf("%d", &n);for(int i = 1; i <= n; ++i)scanf("%d %d", &act[i].begin, &act[i].end);sort(act+1, act+1+n, cmp);for(int i = 1; i <= n; ++i){if(lastAct == 0 || act[i].end <= act[lastAct].begin)//如果第i个活动在当前最后的活动后面开始 {actNum++;//选择第i活动 lastAct = i;}}printf("%d", actNum);return 0;
}

信息学奥赛一本通 1323:【例6.5】活动选择 | 1422:【例题1】活动安排 | 洛谷 P1803 凌乱的yyy / 线段覆盖相关推荐

  1. 信息学奥赛一本通 1294:Charm Bracelet | OpenJudge NOI 2.6 7113:Charm Bracelet | 洛谷 P2871

    [题目链接] ybt 1294:Charm Bracelet OpenJudge NOI 2.6 7113:Charm Bracelet 洛谷 P2871 [USACO07DEC]Charm Brac ...

  2. 信息学奥赛一本通 1911:【00NOIP普及组】税收与补贴问题 | 洛谷 P1023 [NOIP2000 普及组] 税收与补贴问题

    [题目链接] ybt 1911:[00NOIP普及组]税收与补贴问题 洛谷 P1023 [NOIP2000 普及组] 税收与补贴问题 [题目考点] 1. 枚举 2. 数学 3. 二分查找 [解题思路] ...

  3. 《信息学奥赛一本通 提高篇》 第四部分 数据结构 第4章 倍增求LCA

    例题1 点的距离 信息学奥赛一本通(C++版)在线评测系统 例题2 暗的连锁(Poj3417) 信息学奥赛一本通(C++版)在线评测系统 LOj10131 暗的连锁_juruo_xlh-CSDN博客 ...

  4. 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02

    /* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...

  5. 【例8】合唱队形(《信息学奥赛一本通第五版》)

    /* [例8]合唱队形(<信息学奥赛一本通第五版>) http://ybt.ssoier.cn:8088/problem_show.php?pid=1264 [问题描述] N位同学站成一排 ...

  6. 信息学奥赛一本通 2021:【例4.6】最大公约数

    [题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...

  7. 信息学奥赛一本通(2032:【例4.18】分解质因数)

    2032:[例4.18]分解质因数 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 582     通过数: 376 [题目描述] 把一个合数分解成若干个质因数乘积 ...

  8. 信息学奥赛一本通——2062:【例1.3】电影票

    2062:[例1.3]电影票 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 57341     通过数: 34230 [题目描述] 已知一位小朋友的电影票价是10 ...

  9. 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制

    [题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...

最新文章

  1. Nagios+Centreon+Nrpe集成(二)
  2. centos 7.1 yum
  3. .net Forms身份验证不能用在应用的分布式部署中吗?
  4. boost::system::is_error_code_enum相关的测试程序
  5. c++ 该使用类内初始值么?
  6. 【C++进阶】 遵循TDD原则,实现平面向量类(Vec2D)
  7. 64位处理器_电脑操作系统的32位和64位有什么区别
  8. 在线HTML编辑器 KindEditor
  9. 微软使用 Fluent Design 对应用图标进行统一调整,并更新 Windows 10 Logo
  10. 多线程 CreateThread与_beginthreadex本质区别
  11. 1036 和奥巴马一起学编程
  12. html5 canvas类库 实例
  13. openssl genrsa
  14. linux虚拟串口控制器驱动开发及代码实现(uart driver)
  15. 贵州省相关GIS公司或单位
  16. 计算机安全中心无法启动,电脑无法启动windows安全中心服务怎么办?
  17. Python 增加时间戳和今日日期
  18. kube-scheduler源码分析(一)之 NewSchedulerCommand
  19. ipv4地址的编码长度为_请问IPV4是什么意思???
  20. Lnmp Swoole使用wss协议

热门文章

  1. 用c#委托完成信用卡还款情景
  2. 【电气专业知识问答】问:发电机失磁异步运行故障如何处理?
  3. python爬虫实例之爬取智联招聘数据
  4. 基于深度学习的畸变校正
  5. OpenCV图像的按位逻辑运算
  6. 微信小程序 动态计算图片大小
  7. TUG 2020 MOA | 左手技术、右手内容,TUG MOA 刘春雷的榜样之路
  8. Flink中max和maxBy的区别及使用
  9. Vue生命周期(初始阶段、挂载阶段、更新阶段、销毁阶段)
  10. Android Studio Run App 不能自动启动