Educational Codeforces Round 52 (Rated for Div. 2)C. Make It Equal(差分)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sugarbliss/article/details/83062759

题目链接:http://codeforces.com/contest/1065/problem/C

题意:给你n个高度为x的矩形,你每次可以设置一个H,使得高于H的部分都被砍下,砍下部分的和不能大于K,问你最少砍多少次可以使得所有塔的高度达到一致。

思路:我们做n个[1,x]的差分,求出每一个高度的方格个数,然后从最高的矩形开始遍历即可。

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 2e5 + 10;
int h[MAXN];

int main()
{
	int N, K, x, M = -INF;
	cin >> N >> K;
	for (int i = 1; i <= N; i++)
	{
		scanf("%d", &x);
		M = max(x,M);
		h[1]++, h[x + 1]--; //差分
	}
	for (int i = 1; i <= M ; i++)
        h[i] += h[i - 1];

	int cnt = 0, s = 0;
	for (int i = M; i >= 1; i--) //从上往下切
	{
		if (h[i] == N) break;
		if (s + h[i] <= K) s += h[i];
		else s = h[i], cnt++;
	}
	if (s) cnt++; //剩下1层或者n层都相等,再切掉其上一层即可
	cout << cnt << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/sugarbliss/article/details/83062759