区间调度问题

题意:有n项工作,每项工作分别在si时间开始,在ti时间结束。对于每项工作,你都可以选择参与与否。如果选择了参与,那么自始至终都必须全程参与。此外,参与工作的时间段不能重合。然后问你的目标是参与尽可能多的工作,那么你最多能参与多少项工作?

思路:这种题目我们很容易想到贪心的方案,但问题的重点是我们该如何执行贪心。我们在可选的工作中,每次选择结束时间最早的工作。

#include<bits/stdc++.h>

using namespace std;
const int maxn = 100000;

pair<int,int> itv[maxn];

void solve(){
	for(int i=0;i<n;i++){
		itv.first = t[i];
		itv.second = s[i];
	}
	sort(itv,itv+n);
	
	int ans = 0,t = 0;
	
	for(int i=0;i<n;i++){
		if(t < itv.second) ans++,t=itv.first;
	}
	cout<<ans<<endl;
	
}
带权区间调度问题是计算机科学中一种经典的优化问题,通常涉及在一个有限的时间窗口内择一系列互不冲突的任务(区间),每个任务都有其开始时间结束时间,以及相应的收益或权重。目标是最大化总收益。 在C语言中解决这个问题,可能会采用动态规划或者贪心算法,如优先队列(最小堆)来存储任务,首先处理那些收益最大或截止时间最早的任务。以下是一个简化版的基本思路: 1. 定义一个结构体,包含任务的开始时间结束时间和权重。 2. 创建一个优先队列来存储任务,按照结束时间升序排列。 3. 每次从队列中取出一个任务,如果它能在当前时间段完成,就更新总收益并检查是否还有剩余时间可以继续取后续的任务。 4. 使用循环遍历所有可能的起始时间,直到超过给定的时间窗口。 5. 在整个过程中,维护一个变量记录最大收益。 ```c #include <stdio.h> #include <stdlib.h> typedef struct Task { int start; int end; int weight; } Task; int maxProfit(int *timeWindows, int n, int endTime) { // 初始化优先队列和收益 Task tasks[n]; for (int i = 0; i < n; ++i) { tasks[i].start = timeWindows[i][0]; tasks[i].end = timeWindows[i][1]; tasks[i].weight = timeWindows[i][2]; } priority_queue<Task, Task[], greater<Task>> pq; int totalProfit = 0; // 将任务添加到队列并处理 for (int i = 0; i < n; ++i) { pq.push(tasks[i]); while (!pq.empty() && pq.top().end <= endTime) { totalProfit += pq.top().weight; pq.pop(); } } return totalProfit; } int main() { int timeWindows[] = {{1, 3, 1}, {2, 6, 2}, {3, 4, 3}}; // 示例任务数组 int n = sizeof(timeWindows) / sizeof(timeWindows[0]); int endTime = 5; // 时间窗口结束点 printf("Max Profit: %d\n", maxProfit(timeWindows, n, endTime)); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值