NP问题:多机调度问题(贪心)

本文通过C++代码展示了如何使用贪心算法解决多机调度问题。通过优先队列优化,将作业按时间花费从大到小排序,并分配给机器,以最小化最大完成时间。

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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
struct Node
{
    int time;//机器的已经工作的时间
    int d[200];//用于存储在该机器上完成的作业
    int cnt;//记录d数组的个数
    int id;//机器的编号
};
Node Mach[2000];
struct cmp
//优先级队列基于"堆"(内嵌双向链表)的实现,此时入队和出队的时间复杂度都为O(lgn),
//如果用蛮力实现方法是基于"数组"的实现, 此时入队的时间复杂度为O(1),出队的时间复杂度为O(n)
//这样复杂度就大大降低了
{
    bool operator()(Node &a,Node &b)
    {
        return a.time>b.time;//大顶推
    }
};
bool cmp1(int a,int b)//作业大到小排序
{
    return a>b;
}
int n,m;
int cost[2000];//作业花费的时间
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
    cin>>cost[i];
    sort(cost,cost+n,cmp1);
    priority_queue<Node,vector<Node>,cmp>q;//优先队列

    if(m>n)//机器多于作业
    {
        cout<<cost[0]<<endl;
        return 0;
    }
    //作业多于机器
    for(int i=0;i<m;i++)
    {
       Node nw;
       nw.id=i;
       nw.time=cost[i];
       nw.cnt=1;
       nw.d[0]=i;
       q.push(nw);
    }

    for(int i=m;i<n;i++)
    {
        Node tmp=q.top();
        q.pop();
        tmp.d[tmp.cnt]=i;
        tmp.cnt++;
        tmp.time+=cost[i];
        q.push(tmp);
    }
    int ans=0;//记录结果
    while(!q.empty())
    {
        Node tmp=q.top();
        q.pop();
        ans=max(ans,tmp.time);
    }
    cout<<ans<<endl;
    //可以求出每台机器完成的作业
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值