版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}