1. 程式人生 > >C. Make It Equal

C. Make It Equal

題意:給出n個高度,問最少通過多少次代價最多為k的消減能夠使得所有的高度相同。(代價:消減的總高度)


題解:可以考慮從他的最高高度開始一階一階的減,一直減到最小的那個高度,通過記錄每次減一的代價與k進行比較即可得出結果。


a c c o d e

: ac code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define met(a, b) memset(a, b, sizeof(a))
#define rep(i, a, b) for(int i = a; i <= b; i++)
#define per(i, a, b) for(int i = a; i >= b; i--)
#define pb push_back const int maxn = 1e6 + 10; const int inf = 0x3f3f3f3f; ll n, k, h[maxn], cnt[maxn]; int main() { while(~scanf("%lld%lld", &n, &k)) { met(cnt, 0); ll MIN = inf, MAX = 0; rep(i, 1, n) scanf("%lld", &h[i]), MIN = min(h[i], MIN), cnt[h[i]]++, MAX =
max(MAX, h[i]); ll ans = 0, sum = 0; per(i, MAX, MIN + 1) { cnt[i] += cnt[i + 1]; if(sum + cnt[i] > k) { ans++; sum = cnt[i]; } else { sum += cnt[i]; } } printf("%lld\n", ans + (sum > 0)); } return 0; }