牛牛的揠苗助長

2022-09-09 20:15:32 字數 1693 閱讀 3235

一眼二分分天數,然後就是要找合適的高度滿足運算元小於天數

兩種方法:

二分的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天水稻就會長高乙個單位。但是不巧的是整個菜園中每一塊菜地的生長...