牛牛有一塊長度大小為n的菜園,他首先對這塊菜園從1到n進行了編號,每一塊地分別為1號、2號…n號菜地,然後他往每塊菜地中都種下了一些水稻,一開始,第i塊菜地中的水稻高度均為a[i]個單位。然後我們知道水稻的生長週期都是n天,也就是說每逢n天水稻就會長高乙個單位。但是不巧的是整個菜園中每一塊菜地的生長週期都錯開了,具體來說,第1天的時候第1塊菜地中的水稻長高乙個單位,第2天的時候第2塊菜地中的水稻長高乙個單位…第n天的時候第n塊菜地中的水稻長高乙個單位,接下來第n+1天,又輪到第1塊菜地中的水稻長高乙個單位以此類推。
每天在水稻進行自然生長之後,牛牛可以施展他神奇的魔法,這個魔法可以讓任意一塊菜地中的水稻長高乙個單位,或者讓任意一塊菜地中的水稻縮短乙個單位,當然啦,他也可以不進行任何操作。
牛牛看到菜園中的水稻參差不齊十分難受,請問至少在第幾天,他能夠讓所有的水稻都長到同乙個高度?
第一行是乙個正整數n(1≤n≤105 ),表示有菜園有n塊菜地。
接下來一行輸入n個正整數,表示每塊菜地上水稻的高度,水稻的高度1≤a[i]≤109 。
保證一開始輸入時水稻的高度不全都相同(資料保證答案至少為1)。
輸出乙個正整數表示問題的答案。
3
1 2 3
1
在long long範圍內二分答案x。
對於x,令y=x%n。因為自動生長,前y塊地的高度+1。(倍數部分都+1,相當於不變)
現在還需要考慮x次的魔法。要讓使用的魔法次數盡可能的少,就要讓所有水稻的高度向中位數靠近。遍歷模擬靠近的過程,累計使用魔法的次數,如果次數<=x,則x滿足條件。
複雜度:二分logn*(查詢中位數n*logn+遍歷模擬n)=(logn)2*n
#include
#include
#include
#include
using namespace std;
typedef
long
long ll;
const
int n=
1e5+20;
ll n,a[n]
,b[n]
;//原資料存在b陣列中,a陣列用於排序
bool pd
(ll x)
if(z>x)
return0;
else
return1;
}ll fun()
//二分答案
else
l=mid+1;
}return ans;
}int
main()
牛客練習賽63 牛牛的揠苗助長 二分)
題目傳送門 牛牛有一塊長度大小為n的菜園,他首先對這塊菜園從1到n進行了編號,每一塊地分別為1號 2號 n號菜地,然後他往每塊菜地中都種下了一些水稻,一開始,第i塊菜地中的水稻高度均為a i 個單位。然後我們知道水稻的生長週期都是n天,也就是說每逢n天水稻就會長高乙個單位。但是不巧的是整個菜園中每一...
牛客練習賽63 C牛牛的揠苗助長 二分
題目 假設有n天,每天,小麥會按照下標依次增長1個單位,第一天第乙個小麥長,第二天第二個小麥,第n 1天第乙個小麥長。牛牛可以在每天操作,使得任意小麥長1單位或減1單位,求最小的n,使得所有小麥都相同長度 首先想到二分,對天數進行二分,然後已知t天,開始對小麥操作 對於cnt t n天,是對前cnt...
牛牛的揠苗助長(將所有植物對其的最小操作,二分)
題目 牛牛的揠苗助長 牛客 題目描述 感覺這樣直接貼上不太好 有一塊長度為n 1 n 105 的菜地,每塊菜地菜的高度為a i i 1,n,1 a i 109 菜的生長有乙個週期,恰好為n,且第i天a i n 菜地長高1。現有魔法每天可使用一次 使某一塊菜地長高或長矮1,或者不變也行。問最少多少天能...