歷屆試題 分巧克力(二分查詢)

2021-09-11 21:05:08 字數 1736 閱讀 2953

問題描述

兒童節那天有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

樣例輸出

資料規模和約定

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

cpu消耗 < 1000ms

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

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

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

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

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

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

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

思路:假設正方形的邊長為r, 則每塊長方形巧克力能切出的邊長為r的正方形的數量為(長/r)*(寬/r)

讀入資料時 將第i個巧克力的長和寬的最小值儲存在book[i]中,即這塊巧克力可以切出的最大正方形的邊長,

然後將book陣列從小到大排序,將則該陣列的最後一位(book[n])就是這些巧克力可以產生的最大邊長。

最開始我是從邊長為1的正方形開始遍歷到book[n],選出其中能滿足總人數的最大值,然而因為太暴力所以只過了9/10的  樣例

然後換個思路,從book[n]開始倒著往前找,第乙個滿足總人數的邊長一定是最優解,提交試了一下,十個樣例都過了

第一次ac的**如下:

#include#includeusing namespace std;

int cho[100005][2];

int book[100005];

int n,k;

int main()

sort(book+1,book+n+1);

for(int r=book[n];r>=1;r--)

if(sum>=k)

} if(sum>=k)

} cout《修改後的二分查詢:

#include#includeusing namespace std;

int cho[100005][2];

int book[100005];

int n,k;

bool judge(int r)

} return 0;

}int main()

sort(book+1,book+n+1);

int left=1,right=book[n]+1,mid;

while(left最後發現其實根本不需要book陣列 ,只要在輸入的時候比較每塊巧克力長和寬的最小值,選出其中最大值就好了,不需要排序,不過寫了影響也不大 ,就先不改了

歷屆試題 分巧克力 二分

題目鏈結藍橋杯 歷屆真題 題解 問題描述 兒童節那天有k位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。小明一共有n塊巧克力,其中第i塊是hi x wi的方格組成的長方形。為了公平起見,小明需要從這 n 塊巧克力中切出k塊巧克力分給小朋友們。切出的巧克力需要滿足 1.形狀是正方形,邊長是整...

歷屆試題 分巧克力

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

分巧克力(二分查詢)

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