題目:
兒童節那天有 k 位小朋友到小明家做客。
小明拿出了珍藏的巧克力招待小朋友們。
小明一共有 n 塊巧克力,其中第 i 塊是 hi×wi 的方格組成的長方形。
為了公平起見,小明需要從這 n 塊巧克力中切出 k 塊巧克力分給小朋友們。
切出的巧克力需要滿足:
形狀是正方形,邊長是整數
大小相同
例如一塊 6×5 的巧克力可以切出 6 塊 2×2 的巧克力或者 2 塊 3×3 的巧克力。
當然小朋友們都希望得到的巧克力盡可能大,你能幫小明計算出最大的邊長是多少麼?
輸入格式
第一行包含兩個整數 n 和 k。
以下 n 行每行包含兩個整數 hi 和 wi。
輸入保證每位小朋友至少能獲得一塊 1×1 的巧克力。
輸出格式
輸出切出的正方形巧克力最大可能的邊長。
資料範圍
1≤n,k≤105,
1≤hi,wi≤105
輸入樣例:
2 10
6 55 6
輸出樣例:
2題意:
n 個矩
形,現將
n個矩形
等分成k
個正方形
,求正方
形的最大
邊長。數
據保證滿
足至少可
分成k個
1×1的
正方形。
n個矩形,現將n個矩形等分成k個正方形,求正方形的最大邊長。\\資料保證滿足至少可分成k個1×1的正方形。
n個矩形,現
將n個矩
形等分成
k個正方
形,求正
方形的最
大邊長。
資料保證
滿足至少
可分成k
個1×1
的正方形
。 題解:
答 案滿
足二段性
,考慮二
分法
。答案滿足二段性,考慮二分法。
答案滿足二段
性,考慮
二分法。二分
正方形邊
長為m,
對第i塊
hi×w
i的矩形
而言,最
多可以分
成⌊hi
m⌋⋅⌊
wim⌋
塊.
二分正方形邊長為m,對第i塊h_i×w_i的矩形而言,最多可以分成\lfloor\frac\rfloor·\lfloor\frac\rfloor塊.
二分正方形邊
長為m,
對第i塊
hi×
wi的
矩形而言
,最多可
以分成⌊
mhi
⌋⋅⌊
mwi
⌋塊.所以
對每個矩
形能夠分
得的正方
形數量求
和sum
=∑i=
1n⌊h
im⌋⋅
⌊wim
⌋,求得
使得su
m>=k
的最大邊
長。
所以對每個矩形能夠分得的正方形數量求和\\sum=\sum_^n \lfloor\frac\rfloor·\lfloor\frac\rfloor ,求得使得sum>=k的最大邊長。
所以對每個矩
形能夠分
得的正方
形數量求
和sum
=∑i=
1n⌊
mhi
⌋⋅⌊
mwi
⌋,求
得使得s
um>=k
的最大邊
長。注意:二分的
時候注意
,若當前
二分的邊
長能夠分
得的巧克
力數量s
um是大
於等於人
數k的,
則代表方
案可行,
二分的時候注意,若當前二分的邊長能夠分得的巧克力數量sum是大於等於人數k的,則代表方案可行,
二分的時候注
意,若當
前二分的
邊長能夠
分得的巧
克力數量
sum是
大於等於
人數k的
,則代表
方案可行
, 也 就是
說sum
≥k時可
行,分作
一類,此
時更新l
=mid
,否則更
新r=m
id−1
。也就是說 sum\ge k時可行,分作一類,此時更新l=mid,否則更新r=mid-1。
也就是說su
m≥k時
可行,分
作一類,
此時更新
l=mi
d,否則
更新r=
mid−
1。**:
#include
#include
#include
#include
using
namespace std;
const
int n=
1e5+10;
int n,k;
int h[n]
,w[n]
;int
cal(
int x)
intmain()
printf
("%d\n"
,l);
return0;
}
藍橋杯 分巧克力 二分思想
題目描述 兒童節那天有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.形狀是...