一眼二分分天數,然後就是要找合適的高度滿足運算元小於天數
兩種方法:
二分的check函式裡面三分高度,我們可以發現高度關於運算元是乙個凹函式.要注意臨界值
#include
using
namespace std;
typedef
long
long ll;
const
int maxn =
1e5+7;
ll a[maxn]
, n;
ll cheak3
(ll x)
intcheak
(ll m)
for(
int x =-20
; x <=
20; x++
)for
(int i =
1; i <= m % n; i++
) a[i]-=
1;return ans <= m;
}int
main()
printf
("%lld\n"
, ans)
;return0;
}
第二種就是對變化後的水稻排序找中位數,合適的高度就是其中位數
推導
a為排序過的陣列
從2開始: a1,a2要找乙個h使運算元abs(a1-h)+abs(a2-h)=a2-a1,顯然在a1,a2間均可;
然後到3: a1,a2,a3,由上面推得h要在a1,a3間,明顯a2是最優,運算元是a3-a1;
然後到4: a1,a2,a3,a4,明顯,最優h在a2,a3之間 運算元是a4-a1+a3-a2;
當為n時: 抽象在數軸上,即為求解點h使h到數軸上個點距離之和最近,推得是中位數
所以就能愉快的少一次三分hhh
#include
#define ll long long
#define ios ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
using
namespace std;
const ll inf =
0x3f3f3f3f
;const ll maxn =
1e5+7;
ll a[maxn]
;ll n;
ll sum =0;
bool
check
(ll t)
sort
(b +
1, b + n +1)
;for
(int i =
1; i <= n /
2; i++
)return opsum1 <= t;
}int
main()
ll l =
1, r =
1e15
, mid, ans =1;
//printf ("**\n");
while
(l <= r)
printf
("%lld\n"
, ans)
;return0;
}
牛牛的揠苗助長(將所有植物對其的最小操作,二分)
題目 牛牛的揠苗助長 牛客 題目描述 感覺這樣直接貼上不太好 有一塊長度為n 1 n 105 的菜地,每塊菜地菜的高度為a i i 1,n,1 a i 109 菜的生長有乙個週期,恰好為n,且第i天a i n 菜地長高1。現有魔法每天可使用一次 使某一塊菜地長高或長矮1,或者不變也行。問最少多少天能...
牛客練習賽63 牛牛的揠苗助長 二分)
題目傳送門 牛牛有一塊長度大小為n的菜園,他首先對這塊菜園從1到n進行了編號,每一塊地分別為1號 2號 n號菜地,然後他往每塊菜地中都種下了一些水稻,一開始,第i塊菜地中的水稻高度均為a i 個單位。然後我們知道水稻的生長週期都是n天,也就是說每逢n天水稻就會長高乙個單位。但是不巧的是整個菜園中每一...
牛客5531C 牛牛的揠苗助長 二分 中位數
牛牛有一塊長度大小為n的菜園,他首先對這塊菜園從1到n進行了編號,每一塊地分別為1號 2號 n號菜地,然後他往每塊菜地中都種下了一些水稻,一開始,第i塊菜地中的水稻高度均為a i 個單位。然後我們知道水稻的生長週期都是n天,也就是說每逢n天水稻就會長高乙個單位。但是不巧的是整個菜園中每一塊菜地的生長...