1. 程式人生 > 其它 >牛客練習賽63 C.牛牛的揠苗助長(二分+中位數)

牛客練習賽63 C.牛牛的揠苗助長(二分+中位數)

技術標籤:比較有意思的題(可以禍害學弟學妹的題)

傳送門

結論非常顯然啊

因為 n n n天一個迴圈,每個水稻高度加一,所以 n n n天后相對高度不變

因為最後答案可以寫成 x n + y xn+y xn+y的形式

也就是最後只有前 y y y棵樹高度加一

這個過程是滿足單調性的,我們二分天數 k k k

那麼有 k k k次修改機會,讓 a 1 + 1 , a 2 + 1 , a 3 + 1... a y + 1 , a y + 2 . . . a n a_1+1,a_2+1,a_3+1...a_{y+1},a_{y+2}...a_n a1+1,a2+1,a3+1...ay+

1,ay+2...an變成一樣的

顯然修改成他們的中位數就是最優的

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 2e5+10;
int n,a[maxn],b[maxn];
bool isok(int ci)
{
	int y = ci%n;
	for(int i=1;i<=y;i++)	b[i] = a[i]+1;
	for(int i=y+1;i<=n;i++)	b[i] = a[i];
	sort( b+1,b+1+n );
	int x =
b[(n+1)/2], temp = 0; for(int i=1;i<=n;i++) temp += abs( b[i]-x ); return ci>=temp; } signed main() { cin >> n; for(int i=1;i<=n;i++) scanf("%lld",&a[i] ); int l = 1,r = 1e16,ans; while( r>=l ) { int mid = l+r>>1; if( isok(mid) ) ans = mid,r = mid-1;
else l = mid+1; } cout << ans; }