Codeforces 551C GukiZ hates Boxes(二分)

时间:2022-10-27 14:47:47

Problem C. GukiZ hates Boxes

Solution:

  假设最后一个非零的位置为K,所有位置上的和为S

那么答案的范围在[K+1,K+S].

二分这个答案ans,然后对每个人尽量在ans时间内搬最多的砖.可以得出至少需要多少个人才能搬完.这个可以在O(n)的时间内利用贪心得到

只要判断需要的人数是否小于等于实际的人数就好了

时间复杂度O(nlogS)

#include <bits/stdc++.h>
using namespace std; const int N = ;
int a[N];
int n, m, t;
long long s; inline bool check( long long x )
{
int k = m;
long long s = ;
for( int i = ; i <= t; ++i ) {
s += a[i];
while( s + i >= x ) {
s -= x - i;
if( --k < ) return ;
}
}
if(k==) return s<=;
return ;
} int main()
{
ios::sync_with_stdio( );
cin >> n >> m;
for( int i = ; i <= n; ++i ) {
cin >> a[i];
s += a[i];
if( a[i] != ) t = i;
}
long long l = t + , r = s + t,ans=-;
while( l <= r ) {
long long mid = ( l + r ) >> ;
if( check( mid ) ) r = mid - ,ans=mid;
else l = mid + ;
}
cout << r + << endl; }