藍橋杯17屆第九題 分巧克力(二分查詢)

2021-10-05 09:12:09 字數 1877 閱讀 2185

前言:二分查詢一般用於暴力列舉下的優化,在有序的條件下,能極大提公升查詢效率。

兒童節那天有k位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。

小明一共有n塊巧克力,其中第i塊是hi x wi的方格組成的長方形。

為了公平起見,小明需要從這 n 塊巧克力中切出k塊巧克力分給小朋友們。切出的巧克力需要滿足:

1. 形狀是正方形,邊長是整數

2. 大小相同

例如一塊6x5的巧克力可以切出6塊2x2的巧克力或者2塊3x3的巧克力。

當然小朋友們都希望得到的巧克力盡可能大,你能幫小hi計算出最大的邊長是多少麼?

輸入第一行包含兩個整數n和k。(1 <= n, k <= 100000)

以下n行每行包含兩個整數hi和wi。(1 <= hi, wi <= 100000)

輸入保證每位小朋友至少能獲得一塊1x1的巧克力。

輸出輸出切出的正方形巧克力最大可能的邊長。

樣例輸入:

2 10

6 55 6

樣例輸出:

2為了更好地了解二分查詢,我們這裡將暴力列舉與二分查詢進行對比。

舉例比較暴力列舉與二分查詢

在已排序的陣列中,假設我們找到乙個數——10。

暴力列舉:從頭開始找。複雜度為o(n)

二分查詢:從中間開始找。複雜度為o(log2n)

假設n=1010時,要找的數在陣列結尾。

暴力列舉時間複雜度:o(1010)。

二分查詢時間複雜度:o(log21e10)≈o(34)。

查詢效率得到極大提公升。

暴力列舉:記錄每塊巧克力大小,將可切割尺寸從大到小列舉,輸出第乙個符合條件的尺寸值。

複雜度:o(n2)題目最大n=100000,不能在規定時間內通過評測

#include

#define ll long long

using namespace std;

ll n, k;

ll h[

100010

], w[

100010];

intmain()

int cnt;

for(

int i=_max; i>=

0; i--)}

return0;

}

二分查詢:優化列舉環節

從中間巧克力尺寸,開始查詢。若滿足條件則向上查詢,否則向下查詢,直到邊界指標(r、l)相交。

#include

#define ll long long

using namespace std;

ll n, k;

ll h[

100010

], w[

100010];

intmain()

//二分查詢

int mid, cnt, flag, ans =0;

int r =

100001

;int l =1;

while

(l<=r)}if

(flag==0)

r = mid -1;

} cout<

return0;

}

希望能夠將自己的一些學習經驗分享給有需要的人。

我是小鄭,乙個堅持不懈的小白。

第八屆藍橋杯第九題 分巧克力(二分查詢)

為了公平起見,小明需要從這 n 塊巧克力中切出k塊巧克力分給小朋友們。切出的巧克力需要滿足 1.形狀是正方形,邊長是整數 2.大小相同 例如一塊6x5的巧克力可以切出6塊2x2的巧克力或者2塊3x3的巧克力。當然小朋友們都希望得到的巧克力盡可能大,你能幫小hi計算出最大的邊長是多少麼?輸入 第一行包...

第九題 分巧克力

2018.03.20 打卡題 兒童節那天有k位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。小明一共有n塊巧克力,其中第i塊是hi x wi的方格組成的長方形。為了公平起見,小明需要從這 n 塊巧克力中切出k塊巧克力分給小朋友們。切出的巧克力需要滿足 1.形狀是正方形,邊長是整數 2.大小...

藍橋杯 分巧克力 二分思想

題目描述 兒童節那天有k位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。小明一共有n塊巧克力,其中第i塊是hi x wi的方格組成的長方形。為了公平起見,小明需要從這 n 塊巧克力中切出k塊巧克力分給小朋友們。切出的巧克力需要滿足 1.形狀是正方形,邊長是整數 2.大小相同 例如一塊6x5...