牛客練習賽63 C.牛牛的揠苗助長(二分+中位數)
阿新 • • 發佈:2021-02-02
技術標籤:比較有意思的題(可以禍害學弟學妹的題)
結論非常顯然啊
因為 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;
}