之前遇到过这样的题了,但是不会做,今天好好学了一下
就是一个贪心的思想,将工作时间从大到小排序,然后遍历,将此个工作,计入到时间最小的机器中!
#include"stdio.h"
#include"string.h"
#include"queue"
#include"algorithm"
using namespace std;
#define N 100001
struct nodee
{
int i,ans;
}A[N];
struct node
{
int i,ans;
bool friend operator<(node n1,node n2)
{
return n2.ans<n1.ans;
}
};
bool cmp(nodee a,nodee b)
{
return a.ans>b.ans;
}
int main()
{
int T;
int i;
int ans[N];
int n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d",&A[i].ans);
A[i].i=i;
}
priority_queue<node>Q;
node p;
for(i=0;i<m;i++)
{
p.i=i;
p.ans=0;
Q.push(p);
}
sort(A,A+n,cmp);
//for(i=0;i<n;i++)printf("%d\n",A[i].ans);
for(i=0;i<n;i++)
{
p=Q.top();
Q.pop();
p.ans+=A[i].ans;
ans[A[i].i]=p.i;
Q.push(p);
}
printf("%d\n",n);
for(i=0;i<n-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[i]);
}
return 0;
}