题意:给你 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 1000000007 struct 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; }