#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;
}
NP问题:多机调度问题(贪心)
最新推荐文章于 2022-01-15 13:49:43 发布