HDU 2850 Load Balancing(优先队列)

来源:互联网 发布:pos机网络初始化失败 编辑:程序博客网 时间:2024/06/05 22:58



题意:给你 n个数分配给m部分(每部分个数不限),如何使得m部分和的差最小


思路:优先队列,和(sum)最小的优先分配。


#include<cstdio>#include<stdlib.h>#include<string.h>#include<string>#include<map>#include<cmath>#include<iostream>#include <queue>#include <stack>#include<algorithm>#include<set>using namespace std;#define INF 1e8#define eps 1e-8#define ll __int64#define maxn 26#define mol 1000000007struct node{int id;ll sum;friend bool operator<(node a,node b){return a.sum>b.sum;}}a[100005];priority_queue<node>q;int cmp(node a,node b){return a.sum>b.sum;}int main(){int t,n,m;int b[100005];scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);memset(b,0,sizeof(b));int i,j;node p;for(i=0;i<m;i++){p.id=i;p.sum=0;q.push(p);}for(i=0;i<n;i++){scanf("%I64d",&a[i].sum);a[i].id=i;}sort(a,a+n,cmp);for(i=0;i<n;i++){node u=q.top();q.pop();b[a[i].id]=u.id;u.sum+=a[i].sum;q.push(u);}printf("%d\n",n);for(i=0;i<n;i++){printf("%d",b[i]);if(i!=n-1)printf(" ");}printf("\n");while(!q.empty())q.pop();}return 0;}


0 0
原创粉丝点击