藍橋 分巧克力(二分)

2021-08-17 10:11:26 字數 1458 閱讀 7247

問題描述

兒童節那天有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資料規模和約定

峰值記憶體消耗(含虛擬機器) < 256m

cpu消耗 < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。

注意:main函式需要返回0;

只使用ansi c/ansi c++ 標準;

不要呼叫依賴於編譯環境或作業系統的特殊函式。

所有依賴的函式必須明確地在原始檔中 #include

不能通過工程設定而省略常用標頭檔案。

提交程式時,注意選擇所期望的語言型別和編譯器型別。

這個題一開始我是從邊長1開始遍歷,一直到巧克力不夠分給所有人(暴力),但只得87分,後來才知道要用二分簡化,從1到maxn,l = 1, r = maxn, i = (l + r) / 2,所有人都能分到就讓l = i + 1,反之就r = i - 1;要注意的是退出條件是l > r,而不是l >= r,因為l == r時,i有可能還沒取到l(r)。

ac**:

#include#include#include#include#include#define inf 0x3f3f3f3f

#define ll long long

using namespace std;

const int maxn = 100010;

int n, k;

int a[maxn][2];

int main()

int ans = 1;

int l = 1, r = maxn;

for(int i = (l + r) / 2; l <= r; i = (l + r) / 2)

}if(flag == 1)

r = i - 1;

else

l = i + 1;

} printf("%d\n", ans);

return 0;

}

藍橋杯 分巧克力 二分思想

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

藍橋杯 分巧克力(二分搜尋)

歷屆試題 分巧克力 時間限制 1.0s 記憶體限制 256.0mb 問題描述 兒童節那天有k位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。小明一共有n塊巧克力,其中第i塊是hi x wi的方格組成的長方形。為了公平起見,小明需要從這 n 塊巧克力中切出k塊巧克力分給小朋友們。切出的巧克力...

藍橋杯 分巧克力(二分答案)

時間限制 1.0s 記憶體限制 256.0mb 問題描述 兒童節那天有k位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。小明一共有n塊巧克力,其中第i塊是hi x wi的方格組成的長方形。為了公平起見,小明需要從這 n 塊巧克力中切出k塊巧克力分給小朋友們。切出的巧克力需要滿足 1.形狀是...