差分+贪心
最近没时间写题解了...改天补上
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
#include <deque>
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
bool cmp(int a, int b) {
return a > b;
}
int n;
long long cost;
long long ans;
int k;
int temp[2 * 100000 + 5];
int diff[2 * 100000 + 5];
int level[2 * 100000 + 5];
int main() {
for (int i = 0;i < (2 * 100000 + 5);++i) {
temp[i] = 0;
diff[i] = 0;
level[i] = 0;
}
scanf("%d %lld", &n, &cost);
if (n == 1) {
printf("0\n");
}
else {
for (int i = 1;i <= n;++i) {
scanf("%d", &temp[i]);
}
sort(temp + 1, temp + 1 + n, cmp);
if (temp[1] == temp[n]) {
printf("0\n");
}
else {
for (int i = 1;i <= n;++i) {
temp[i] = temp[i] - temp[n];
}
ans = 0;
k = 1;
while (temp[k] != 0) {
diff[k] = temp[k];
k++;
}
k--;
/*
for (int i = 1;i <= k;++i) {
for (int j = 1;j <= diff[i];++j) {
level[j]++;
}
}
*/
for (int i = 1;i <= n;++i) {
level[1]++;
level[temp[i] + 1]--;
}
for (int i = 2;i <= diff[1];++i) {
level[i] += level[i - 1];
}
int p = diff[1];
while (p > 0) {
long long c = 0;
int i;
for (i = p;i >= 1;--i) {
c += level[i];
if (c > cost) {
ans++;
p = i;
break;
}
if (i == 1) {
p = 0;
ans++;
}
}
}
printf("%lld\n", ans);
}
}
//system("pause");
return 0;
}