每次自己写优先队列都会有一种很山寨的感觉。
将所有的容器入队,将任务从大到小排列,每次把任务都分配给当前最清闲的容器。
第一次提交的时候竟然因为没有输出那个nwa了。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> using namespace std; #define N 100005 struct point { int x,y; int id; }a[N]; struct node { int x,id; bool friend operator<(node x,node y) { return y.x<x.x; } }b[105]; int cmp(const void *a,const void *b) { point *c,*d; c=(point *)a; d=(point *)b; return d->x-c->x; } int cmp1(const void *a,const void *b) { return (*(point *)a).id-(*(point *)b).id; } int main() { int T; scanf("%d",&T); while(T--) { int n,m; scanf("%d%d",&n,&m); int i; for(i=0;i<n;i++) { scanf("%d",&a[i].x); a[i].id=i; } qsort(a,n,sizeof(a[0]),cmp); priority_queue<node>q; node cur; for(i=0;i<m;i++) { b[i].x=0; b[i].id=i; q.push(b[i]); } for(i=0;i<n;i++) { cur=q.top(); q.pop(); cur.x+=a[i].x; a[i].y=cur.id; q.push(cur); } qsort(a,n,sizeof(a[0]),cmp1); printf("%d\n",n); for(i=0;i<n-1;i++) printf("%d ",a[i].y); printf("%d\n",a[i].y); } return 0; }