C/C++,组合算法——K人活动选择问题(Activity-Selection-Problem)的源程序
1 活动选择问题
Activity-Selection-Problem with k persons
给定两个大小为 N 的数组S[]和E[]表示商店的开始和结束时间,以及一个整数值 K 表示人数,
任务是找出如果他们基于以下条件最佳地访问每个商店,他们总共可以访问的商店的最大数量:
(1)一家商店只能被一个人光顾;
(2)一个人不能去另一家商店,如果它的时间与它冲突;
Activity Selection problem is a approach of selecting non-conflicting tasks based on start and end time and can be solved in O(N logN) time using a simple greedy approach. Modifications of this problem are complex and interesting which we will explore as well. Suprising, if we use a Dynamic Programming approach, the time complexity will be O(N^3) that is lower performance.
The problem statement for Activity Selection is that "Given a set of n activities with their start and finish times, we need to select maximum number of non-conflicting activities that can be performed by a single person, given that the person can handle only one activity at a time." The Activity Selection problem follows Greedy approach i.e. at every step, we can make a choice that looks best at the moment to get the optimal solution of the complete problem.
Our objective is to complete maximum number of activities. So, choosing the activity which is going to finish first will leave us maximum time to adjust the later activities. This is the intuition that greedily choosing the activity with earliest finish time will give us an optimal solution. By induction on the number of choices made, making the greedy choice at every step produces an optimal solution, so we chose the activity which finishes first. If we sort elements based on their starting time, the activity with least starting time could take the maximum duration for completion, therefore we won't be able to maximise number of activities.
2 文本格式
#include <bits/stdc++.h>
using namespace std;
// Comparator
bool compareBy(const pair<int, int>& a,
const pair<int, int>& b)
{
if (a.second != b.second)
return a.second < b.second;
return a.first < b.first;
}
// Function to find maximum shops
// that can be visited by K persons
int maximumShops(int* opening, int* closing,
int n, int k)
{
// Store opening and closing
// time of shops
pair<int, int> a[n];
for (int i = 0; i < n; i++) {
a[i].first = opening[i];
a[i].second = closing[i];
}
// Sort the pair of array
sort(a, a + n, compareBy);
// Stores the result
int count = 0;
// Stores current number of persons visiting
// some shop with their ending time
multiset<int> st;
for (int i = 0; i < n; i++) {
// Check if current shop can be
// assigned to a person who's
// already visiting any other shop
bool flag = false;
if (!st.empty()) {
auto it = st.upper_bound(a[i].first);
if (it != st.begin()) {
it--;
// Checks if there is any person whose
// closing time <= current shop opening
// time
if (*it <= a[i].first) {
// Erase previous shop visited by the
// person satisfying the condition
st.erase(it);
// Insert new closing time of current
// shop for the person satisfying ṭhe
// condition
st.insert(a[i].second);
// Increment the count by one
count++;
flag = true;
}
}
}
// In case if no person have closing
// time <= current shop opening time
// but there are some persons left
if (st.size() < k && flag == false) {
st.insert(a[i].second);
count++;
}
}
// Finally print the ans
return count;
}
// Driver Code
int main()
{
// Given starting and ending time
int S[] = { 1, 8, 3, 2, 6 };
int E[] = { 5, 10, 6, 5, 9 };
// Given K and N
int K = 2, N = sizeof(S) / sizeof(S[0]);
// Function call
cout << maximumShops(S, E, N, K) << endl;
}
3 代码格式
#include <bits/stdc++.h>
using namespace std;
// Comparator
bool compareBy(const pair<int, int>& a,
const pair<int, int>& b)
{
if (a.second != b.second)
return a.second < b.second;
return a.first < b.first;
}
// Function to find maximum shops
// that can be visited by K persons
int maximumShops(int* opening, int* closing,
int n, int k)
{
// Store opening and closing
// time of shops
pair<int, int> a[n];
for (int i = 0; i < n; i++) {
a[i].first = opening[i];
a[i].second = closing[i];
}
// Sort the pair of array
sort(a, a + n, compareBy);
// Stores the result
int count = 0;
// Stores current number of persons visiting
// some shop with their ending time
multiset<int> st;
for (int i = 0; i < n; i++) {
// Check if current shop can be
// assigned to a person who's
// already visiting any other shop
bool flag = false;
if (!st.empty()) {
auto it = st.upper_bound(a[i].first);
if (it != st.begin()) {
it--;
// Checks if there is any person whose
// closing time <= current shop opening
// time
if (*it <= a[i].first) {
// Erase previous shop visited by the
// person satisfying the condition
st.erase(it);
// Insert new closing time of current
// shop for the person satisfying ṭhe
// condition
st.insert(a[i].second);
// Increment the count by one
count++;
flag = true;
}
}
}
// In case if no person have closing
// time <= current shop opening time
// but there are some persons left
if (st.size() < k && flag == false) {
st.insert(a[i].second);
count++;
}
}
// Finally print the ans
return count;
}
// Driver Code
int main()
{
// Given starting and ending time
int S[] = { 1, 8, 3, 2, 6 };
int E[] = { 5, 10, 6, 5, 9 };
// Given K and N
int K = 2, N = sizeof(S) / sizeof(S[0]);
// Function call
cout << maximumShops(S, E, N, K) << endl;
}
相关文章:

java11 微信退款 No appropriate protocol
java11 微信退款 No appropriate protocol

2024年,Rust和Go学哪个更好?
这两种语言,GoLang和Rust,由于它们非常相近的起源时间,被认为是彼此的竞争对手。Go的发展速度比Rust快。这两种语言有很多相似之处。GoLang和Rust之间的区别在于Go是简单的,而Rust是复杂的。然而,它们的功能和优先级在各种有意义的方面有所不同。Go与Rust并驾齐驱。这意味着这完全取决于你拥有的项目类型,主要取决于对你的业务来说什么是最好的。

spring cloud 整合Feign经行远程调用
使用Feign的步骤:① 引入依赖② 添加@EnableFeignClients注解③ 编写FeignClient接口④ 使用FeignClient中定义的方法代替RestTemplate类型作用说明修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象请求参数编码将请求参数编码,便于通过http请求发送支持的注解格式默认是SpringMVC的注解失败重试机制。

如何使用 Oracle SQL Developer 连接 pgvector
如何使用 Oracle SQL Developer 连接 pgvector

分布式事务有哪些解决方案?
分布式事务是分布式系统中非常重要的一部分,最典型的例子是银行转账和扣款,A 和 B 的账户信息在不同的服务器上,A 给 B 转账 100 元,要完成这个操作,需要两个步骤,从 A 的账户上扣款,以及在 B 的账户上增加金额,两个步骤必须全部执行成功;否则如果有一个失败,那么另一个操作也不能执行。分布式事务的经典应用比如转账扣款,下订单扣库存,新会员送积分等等涉及多个业务共同参与在一个请求中。

Linux安装MariaDB数据库
命令:yum install mariadb mariadb-server -y。命令:mysql_secure_installation。环境:centos7,可以连接外网。一、安装MariaDB。

Spring-Boot---项目创建和使用
Spring的诞生是为了简化Java程序开发的;而Spring-Boot的诞生是为了简化Spring程序开发的。快速集成框架:Spring-Boot提供了启动添加依赖的功能,用于秒级集成各种框架内置运行容器:内置了Tomcat等Web容器,无需配置可以直接运行和部署快速部署项目:更方便的把项目部署到云服务器上完全抛弃繁琐的XML:使用注解和配置的方式进行开发支持更多的监控指标:可以更好的了解项目的运行情况我们自己要创建的类要放在和启动类的同级目录下,如果不在同级运行时会报错。
.net中优秀依赖注入框架Autofac看一篇就够了
Autofac 是一个功能丰富的 .NET 依赖注入容器,用于管理对象的生命周期、解决依赖关系以及进行属性注入。本文将详细讲解 Autofac 的使用方法,包括多种不同的注册方式,属性注入,以及如何使用多个 ContainerBuilder 来注册和合并组件。我们将提供详细的源代

Asp.Net Core Web Api内存泄漏问题
使用Asp.Net Core Web Api框架开发网站中使用到了tcp socket通信,网站作为服务端开始tcp server,其他的客户端不断高速给它传输信息时,tcp server中读取信息每次申请的byte[]没有得到及时的释放,导致内存浪费越来越多,最终内存溢出,系统崩溃。而使用Asp.Net Core Web Api框架搭建的项目中跑这个服务端代码,则是这样的,很少引发GC,没有及时回收buffer数组的无效内存空间。,则正常引发GC,每次申请的buffer数组都得到及时的释放。

深入理解网络阻塞 I/O:BIO
该篇博文主要介绍的是 I/O 模型中的阻塞 I/O -> BIO,简要分析了 BIO 流程图及相关系统函数调用,通过实践代码的方式来分析阻塞 I/O 在系统调用中所涉及到的流程,最后,介绍了相关联的系统函数:strace、socket、bind、listen、accept,希望能够得到你的支持,感谢三连

如何解决Hyper-V中的虚拟机出现“无法连接到虚拟机配置存储”的问题
上图是借用网上其它友友的图片,由于一直未在网上找到解决方案,后来无意中解决了这个问题后,把解决过程在此记录下来,方便有需要的其它友友。 先来说下我出现上述问题的背景: 我的电脑有三个硬盘:Disk0,是固态硬盘,不知道历史上什么原因,2个分区的字母分得太开了。这个对于我这种有强迫症的人来说,很难受,

HarmonyOS之 开发环境搭建
HarmonyOS开发环境搭建_鸿蒙开发环境搭建

web前端之JavaScrip中的闭包
。web前端之JavaScrip中的闭包_js 单词排序

Docker快速入门(docker加速,镜像,容器,数据卷常见命令操作整理)
可以简单地理解为每启动一个docker镜像就会占用计算机一个进程,这个进程和另外起的docker镜像的进程是相互独立的,以数据库为例,每个镜像都会copy一份数据库,在他所在的进程中.别的镜像在修改的时候也只能修改自己镜像中的数据库,相当于每个镜像都是一台小型的相互独立的计算机。Docker本质是将代码所需的环境依赖进行打包运行,而在Docker中最重要的是镜像和容器。容器就是包裹镜像的,将镜像启动起来,使得每个镜像之间都相互隔离,互不干扰。使用docker logs 容器名,查看容器的运行日志。

【ASP.NET Core】MVC过滤器:常见用法
前面老周给大伙伴们演示了过滤器的运行流程,大伙只需要知道下面知识点即可: 1、过滤器分为授权过滤、资源访问过滤、操作方法(Action)过滤、结果过滤、异常过滤、终结点过滤。上一次咱们没有说异常过滤和终结点过滤,不过老周后面会说的。对这些过滤器,你有印象就行了。 2、所有过滤器接口都有同步版本和异步

【Windows】内网穿透实现hMailServer远程发送邮件
hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网映射工具即可实现远程发送邮件,不需要使用公网服务器,不需要域名,而且邮件账号名称可以自定义.

C++嵌入式开发:开发嵌入式系统的驱动程序和应用
这是一个简化的示例,实际上,LED驱动程序还需要与硬件进行交互,通过控制寄存器或引脚等方式实现LED的开关。请注意,实际开发中涉及硬件操作,需要根据具体的嵌入式系统和硬件进行适当的配置和调试,确保代码正确地与硬件进行交互。以上示例代码仅展示嵌入式开发中的简单场景,实际的嵌入式开发涉及更多复杂的任务和组件,如中断处理、通信协议、传感器接口等

【C++ Primer Plus】C++11 深入理解右值、右值引用和完美转发
1. 右值引用和移动语义 1.1 左值和右值 左值 local value:存储在内存中、有明确存储地址(可寻址)的数据(x、y、z) 右值 read value:不一定可以寻址,例如存储于寄存器中的数据;通常字面量都是右值,除了字符串常量(1、3) int x = 1; int y =

【HTTP协议】简述HTTP协议的概念和特点
HTTP(Hypertext Transfer Protocol)是一种用于在Web上进行数据通信的协议。它是基于客户端-服务器模型的,其中客户端发送请求,服务器返回响应。

零基础搭建本地Nextcloud私有云结合内网穿透实现远程访问
文章浏览阅读753次,点赞53次,收藏47次。本文主要讲解如何搭建本地Nextcloud私有云结合内网穿透实现远程访问

centos7下执行yum命令报错
文章浏览阅读323次,点赞11次,收藏7次。在Linux系统中,安装nginx时候,需要先安装环境。Nginx是使用C语言开发,安装nginx需要先从官网上将源码下载,然后编译,编译需要gcc环境,但是在安装gcc环境的时候,执行命令报错。

鸿蒙开发软件用什么编程语言?
鸿蒙经过几年的迭代,抛弃了Java,基于TS出了一个官方推荐的ArkTS语言,甩开了JVM,提升效率,同时支持自己研发的一些现代化特性,没有版权的问题,现在唯一的问题就是各大公司愿不愿意为它去适配生态了,还好的是,目前各大互联网公司已经开始适配了。

spring cloud Eureka注册中心和Nacos注册中心
文章浏览阅读103次。代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:@Bean配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则注意。

通过.NET Core+Vue3 实现SignalR即时通讯功能
.NET Core 和 Vue3 结合使用 SignalR 可以实现强大的实时通讯功能,允许实时双向通信。在这个示例中,我们将详细说明如何创建一个简单的聊天应用程序,演示如何使用 .NET Core SignalR 后端和 Vue3 前端来实现实时通讯功能。 步骤1:准备工作 确保你已经安装了以下工

Python爬虫遇到重定向URL问题时如何解决?
文章浏览阅读652次,点赞14次,收藏6次。重定向是指当用户请求一个URL时,服务器返回一个中断请求的URL的响应。这种情况通常发生在网站对URL进行了修改或者重定向到其他页面的情况下。其中,如果处理不当开发,可能会导致爬虫无法获取所需的数据,从而影响爬虫的效果。在Python爬虫开发中,处理重定向URL问题是非常的。我们使用可以请求库来处理重定向,通过查看重定向后的重要URL和重定向历史来了解重定向的情况,从而确保爬虫能够正确获取所需的数据。

C# 实现微信退款及对帐
文章浏览阅读1.6k次,点赞77次,收藏84次。本次我们以微信支付进行举例,在考生注册账号、编写简历、报名职位、被初审核通过等一系列基础的条件的具备下,可以进入支付考务费的环节(笔试费用),我们会为其生成一个支付二维码,考生支付后(无论成功与否),都会记录其支付结果状态。以上提供的代码仅供参考,在实际的应用中,我们还可以根据业务需要编写其它功能,如下载微信官方对帐单,导入到应用系统中,与业务数据进行对帐,以排查争议数据;退款申请成功后,仅为申请状态,需要通过查询退款情况以确定是否完成,该功能可以在考生方进行实现,考生可随时查询自己的对帐情况。

uniapp开发App从开发到上架全过程
当我们的APP开发完毕,最终交付的时候,必然要经历的一个环节,就是APP上架,国内APP上架一般为IOS端appstore上架,安卓端应用商店比较多,最常见的应用商店有华为应用商店、小米应用商店、OPPO应用商店、VIVO应用商店、应用宝应用商店等。 在开始上架 前,需要准备好相应的材料,安卓端

vue实现动态路由菜单!!!
文章浏览阅读244次,点赞2次,收藏2次。递归处理后端响应的菜单树,后依次通过addRoute方法往静态父路由,添加动态子路由,添加完使用el-menu渲染并添加router属性实现路由菜单模式。

GaussDB数据库SQL系列-触发器
文章浏览阅读680次,点赞37次,收藏33次。GaussDB数据库中的触发器是一种强大的工具,可用于自动化数据处理、数据验证、日志记录等任务。通过使用触发器,您可以提高数据一致性、减少数据冗余、实施业务规则并增强数据安全性。本文介绍了GaussDB数据库中触发器的基本概念、创建步骤和示例。希望能够帮助您更好地了解和使用GaussDB中的触发器功能。

本地Nginx服务搭建结合内网穿透实现多个Windows Web站点公网访问
文章浏览阅读1.1k次,点赞96次,收藏91次。访问http://127.0.0.1:9200/登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道,点击右侧的编辑。接下来,我们通过强大的且稳定的内网穿透工具cpolar,将本地nginx服务暴露至公网环境,以实现穿透多个站点端口需求,无需公网IP,也不用设置路由器。提示更新隧道成功,点击左侧仪表盘的状态——在线隧道列表,可以看到公网地址已经更新为保留成功的二级子域名,将其复制下来。修改隧道信息,将保留成功的二级子域名配置到隧道中。