1400*C. Phoenix and Towers(贪心)

1400*C. Phoenix and Towers(贪心)_第1张图片

 题意:

        将 n 个数字分成 m 组,使得每两组的差值都不超过 x ,打印每个数的分组的组数

 解析:

        因为每一个数都不超过 x ,所以两个数的差值必定不超过 x,每次选最矮的一座塔放入当前的砖块,并且记录塔的标号。

        贪心证明:当一次放入k之后,出现了超过 x 的两座塔 p(矮)、q(高),那么 k 必定是放入了 q ,那么 q 减去放入的 k 必定比 p 更高,那么 k 则不能放入 q,矛盾。

#include
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,vector>,greater>>q;
		for(int i=1;i<=m;i++) q.push({0,i});
		for(int i=1;i<=n;i++){
			scanf("%d",&k);
			pairu=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;
}

你可能感兴趣的:(codeforces,c语言,算法,c++,贪心,数据结构)