F - Make It Equal CodeForces - 1065C

Posted accepting

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了F - Make It Equal CodeForces - 1065C相关的知识,希望对你有一定的参考价值。

题目大意:有n座塔,塔高h[i],每次给定高度H对他们进行削切,要求每次削掉的所有格子数不能超过k个,输出最少削几次才能使所有塔的高度相同。

思路一:差分+贪心

对于每一个高度h,用一个数组让1~h的数,每一个都加一。用差分求一下后缀和可以完成。

AC code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2E5+7;
ll arr[N];
int main()
{
    ll n,k;
    cin>>n>>k;
    ll x;
    ll c=0;
    for(ll i=1;i<=n;i++){
        cin>>x;
        c=max(x,c);
        arr[x]++;
    }
    for(ll i=c;i>=1;i--){
        arr[i]+=arr[i+1];
    }
    ll sum=0;
    ll cnt=0;
    for(ll i=c;i>=1;i--){
        if(arr[i]==n){
            if(cnt!=0){
                sum++;
                break;
            }
            else break;
        }
        cnt+=arr[i];
        if(cnt>k){
            cnt=arr[i];
            sum++;
        }
    }
    cout<<sum<<endl;
    return 0;
}

用线段树加二分也可以过:https://blog.csdn.net/Amovement/article/details/83449446

以上是关于F - Make It Equal CodeForces - 1065C的主要内容,如果未能解决你的问题,请参考以下文章

CF1065C Make It Equal

Codeforces 1065C Make It Equal(差分+贪心)

Educational Codeforces Round #52 C. Make It Equal

Codeforces Round #629 (Div. 3) F - Make k Equal (离散化 树状数组维护前缀和)

CF-1328 F. Make k Equal

[CF 1043F] Make It One