hiho一下:155周 任务分配

本文介绍了一种基于任务起止时间的任务调度算法,通过合理分配机器资源,实现最少机器数量完成所有任务的目标。算法采用结构体存储任务信息,自定义排序规则,并使用set数据结构维护各机器的任务结束时间,最终确定所需的最小机器数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述
给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), …, ( SN, EN ), 计算最少需要多少台机器才能按时完成所有任务。

同一时间一台机器上最多进行一项任务,并且一项任务必须从头到尾保持在一台机器上进行。任务切换不需要时间。

输入
第一行一个整数 N,(1 ≤ N ≤ 100000),表示任务的数目。 以下 N 行每行两个整数 Si, Ei,(0 ≤ Si < Ei ≤ 1000000000),表示任务的起至时间。

输出
输出一个整数,表示最少的机器数目。

样例输入
5
1 10
2 7
6 9
3 4
7 10
样例输出
3

思路:定义结构体work(sTime, eTime);表示任务的起始、终止时间,找到最大终止时间,即为所有任务结束的时间。定义排序规则:按照sTime从小到大排序,sTime相同则按照eTime从小到大排序,之后遍历,如果一项任务无法添加到所有已有的任务之后,就添加一台新机器(这里用set来维护一个eTime数组,表示现有机器上的任务的结束时间数组),最后,set的大小即为所需机器的数量。

参考代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <set>

struct work {
    int sTime;
    int eTime;
};
bool cmp(work w1, work w2) {
    if (w1.sTime == w2.sTime) {
        return w1.eTime < w2.eTime;
    }
    return w1.sTime < w2.sTime;
}
int main() {
    using namespace std;
    int n;
    while (cin >> n) {
        vector<work> works(n);
        int endTime = 0;
        for (int i = 0; i < n; i++) {
            cin >> works[i].sTime >> works[i].eTime;
            if (endTime < works[i].eTime) {
                endTime = works[i].eTime;
            }
        }
        sort(works.begin(), works.end(), cmp);
        multiset<int> ans;
        for (int i = 0; i < n; i++) {
            multiset<int>::iterator itor = ans.upper_bound(works[i].sTime);
            if (ans.empty()) {
                ans.insert(works[i].eTime);
            }
            else if (itor != ans.begin()) {
                ans.erase(--itor);
                ans.insert(works[i].eTime);
            }
            else {
                ans.insert(works[i].eTime);
            }
        }
        cout << ans.size() << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值