题意:
将 n 个数字分成 m 组,使得每两组的差值都不超过 x ,打印每个数的分组的组数
解析:
因为每一个数都不超过 x ,所以两个数的差值必定不超过 x,每次选最矮的一座塔放入当前的砖块,并且记录塔的标号。
贪心证明:当一次放入k之后,出现了超过 x 的两座塔 p(矮)、q(高),那么 k 必定是放入了 q ,那么 q 减去放入的 k 必定比 p 更高,那么 k 则不能放入 q,矛盾。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int t,n,m,x,a[N],k;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&x);
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
for(int i=1;i<=m;i++) q.push({0,i});
for(int i=1;i<=n;i++){
scanf("%d",&k);
pair<int,int>u=q.top();
q.pop();
q.push({u.first+k,u.second});
a[i]=u.second;
}
puts("YES");
for(int i=1;i<=n;i++) printf("%d ",a[i]);
puts("");
}
return 0;
}