算法分析与设计-第10次作业-贪心算法-相容问题

本文介绍了一种解决活动选择问题的贪心算法,通过堆排序对活动截止时间进行排序,采用贪心策略选择相容活动,实现资源的最大化利用。文章详细描述了算法流程,包括结构体定义、堆排序应用、活动选择逻辑及输出结果。

1、问题

在这里插入图片描述

2、解析

定义结构体-活动:id号,开始时间,截止时间
使用堆排序对活动的截止时间进行排序
设置集合将相容的活动加进集合中相容的条件是,
前一个选进的活动的截至时间<新的准备加进集合的活动的开始时间(贪心策略)
给出输入案例:
n=10//10个活动
1 1 4//活动的id,开始时间,截止时间
2 3 5
3 2 6
4 5 7
5 4 9
6 5 9
7 6 10
8 8 11
9 8 12
10 2 12
输出选进活动的总数,每个选进活动的id,开始时间和截止时间
在这里插入图片描述

3、设计
struct item {
int id; //活动编号
int start;//活动开始时间
int end;//活动截至时间
};
int main() {
int n;//活动个数
int maxsize = 1;//最多有多少个活动
int ei;//初始截至时间
struct item act[100];
struct item x[100];
int id = 0;
scanf_s("%d", &n);
for (int i = 0; i < n; i++) {
scanf_s("%d %d %d", &act[i].id, &act[i].start, &act[i].end);
}
//将截止时间进行堆排序
heapsort(act, n);
ei = act[0].end;
x[id] = act[0];
//判断是否加入活动中
for (int i = 1; i <= n - 1; i++) {
if (act[i].start > ei) {
maxsize++;
x[++id] = act[i];
ei = act[i].end;
}
}
printf("%d\n", maxsize);
for (int i = 0; i < maxsize; i++) {
printf("%d %d %d\n", x[i].id, x[i].start, x[i].end);
}
}

4、分析

O(n)

5、源码

源码地址:https://github.com/ACynj/greedy.git

代码下载地址: https://pan.quark.cn/s/35e46f7e83fb 关于 Build Status Lines of code 这是一个参考 PotPlayer 的界面使用 Java 以及图形界面框架 JavaFX 使用 MCV 图形界面业务逻辑分离的开发模式, 所开发的个人视频播放器项目, 开发这个项目旨在于学习图形界面框架 JavaFX 实现了具有和 PotPlayer相同 的简洁界面和流畅的操作逻辑。 Note: PotPlayer 是 KMPlayer 的原制作者姜龙喜先生(韩国)进入 Daum 公司后的 新一代网络播放器, PotPlayer的优势在于强大的内置解码器以及支持各类的 视频格式, 而且是免费下载提供使用的。 目前版本: 2020/10/28 v1.0.0 [x] 支持打开文件自动播放 [x] 支持查看播放记录 [x] 支持屏幕边沿窗口自动吸附 [x] 支持双击视频来播放和暂停 [x] 支持左键点击窗口任意位置来拖到窗口 [x] 支持左键双击播放窗口打开文件 [x] 支持根据视频尺寸自动调整窗口大小 [x] 支持根据播放文件类型调整窗口模式 [x] 支持根据视频尺寸自动调整窗口显示位置防止超出屏幕 [x] 支持记录上一访问的文件路径 [x] 支持播放记录文件读写 已实现样式 未播放效果: 播放效果: 运行环境 本项目使用 NetBeans 配合 JDK 开发, NetBeans8.0 以及 JDK8.0 以上版本的均可以运行。 亦可使用其他集成开发环境, 例如 Eclipse, IntelliJ IDEA 配合使用 JDK8.0 以上版本均可构建此项目。 NetBeans download Eclipse downlo...
### C++ 贪心算法 实现 活动安排问题 示例代码教程 活动安排问题是经典的贪心算法应用场景之一。通过优先选择结束时间最早的活动,可以确保剩余的空闲时间最大化,从而实现最多的活动安排。以下为完整的C++代码示例以及相关说明。 #### 示例代码 以下是使用C++实现贪心算法解决活动安排问题的完整代码: ```cpp #include <iostream> using namespace std; // 对活动按照结束时间进行排序 void sortActivities(int n, int s[], int f[]) { for (int i = 1; i <= n - 1; i++) { for (int j = i + 1; j <= n; j++) { if (f[i] > f[j]) { // 交换结束时间 int temp = f[i]; f[i] = f[j]; f[j] = temp; // 同时交换开始时间 temp = s[i]; s[i] = s[j]; s[j] = temp; } } } } // 贪心算法核心部分 int greedySelector(int n, int s[], int f[], bool A[]) { A[1] = true; // 第一个活动默认选中 int j = 1; // 当前已选中的最后一个活动 int count = 1; // 已选中的活动数量 for (int i = 2; i <= n; i++) { if (s[i] >= f[j]) { // 如果当前活动上一个活动不冲突 A[i] = true; // 选中当前活动 j = i; // 更新已选中的最后一个活动 count++; // 增加选中活动数量 } else { A[i] = false; // 不选中当前活动 } } return count; // 返回选中活动的数量 } int main() { int n; // 活动数量 cout << "请输入活动数量:"; cin >> n; int s[50], f[50]; // 开始时间和结束时间数组 bool A[50]; // 标记活动是否被选中 cout << "请依输入每个活动的开始时间和结束时间:" << endl; for (int i = 1; i <= n; i++) { cin >> s[i] >> f[i]; } // 按照结束时间对活动进行排序 sortActivities(n, s, f); // 输出排序后的活动 cout << "排序后的活动(开始时间,结束时间):" << endl; for (int i = 1; i <= n; i++) { cout << "(" << s[i] << ", " << f[i] << ") "; } cout << endl; // 使用贪心算法选择活动 int count = greedySelector(n, s, f, A); // 输出结果 cout << "最多可以安排的活动数量为:" << count << endl; cout << "活动的选取情况(1表示选中,0表示未选中):" << endl; for (int i = 1; i <= n; i++) { cout << A[i] << " "; } cout << endl; return 0; } ``` #### 代码说明 1. **活动排序**:在`sortActivities`函数中,活动按照结束时间进行非减序排列[^1]。 2. **贪心选择**:在`greedySelector`函数中,优先选择结束时间最早的活动,并检查后续活动是否相容[^3]。 3. **复杂度分析**: - 排序的时间复杂度为O(nlogn)[^4]。 - 贪心选择的时间复杂度为O(n)[^4]。 - 总体时间复杂度为O(nlogn)。 #### 示例运行 假设输入如下: ``` 请输入活动数量:6 请依输入每个活动的开始时间和结束时间: 1 3 3 5 0 7 5 8 7 10 8 11 ``` 程序输出: ``` 排序后的活动(开始时间,结束时间): (1, 3) (3, 5) (5, 8) (7, 10) (0, 7) (8, 11) 最多可以安排的活动数量为:4 活动的选取情况(1表示选中,0表示未选中): 1 1 1 1 0 1 ``` #### 注意事项 - 输入的活动数量和时间范围应合理,避免越界访问数组。 - 如果活动数量较大,建议使用动态分配内存以替代固定大小的数组。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值