题目链接:C - Make It Equal
题目大意:给n个柱子,每个柱子的高度为a[i],给一个k >= n,切一次费用的价值是切下来的柱子个数,问最少切多少次能让所有柱子高度相等
解题思路:给a排个序,从头到尾一层一层切需要的价值放在数组b里面,然后遍历一下b即可
Ac Code:
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<ext/rope>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define pb push_back
#define lowbit(x) x&(-x)
#define PII pair<int, int>
#define all(x) x.begin(), x.end()
#define FAST ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int mod = (int)1e9 + 7;
const int maxn = (int)2e5 + 5;
using namespace std;
using __gnu_cxx::crope;
int a[maxn], b[maxn];
int main()
{
int n, k; scanf("%d %d", &n, &k);
for(int i = 1; i <= n; i++) scanf("%d", a + i);
sort(a + 1, a + n + 1, greater<int>());
int cnt = 0;
for(int i = 1; i <= n - 1 && a[i] != a[n]; i++){
while(a[i] == a[i+1]) i++;
for(int j = 1; j <= a[i] - a[i+1]; j++){
b[++cnt] = i;
}
}
int ans = 0;
for(int i = 1; i <= cnt; ){
int sum = 0;
while(sum + b[i] <= k){
sum += b[i];
i++;
}
ans++;
}
printf("%d\n", ans);
return 0;
}
over