トピックのアドレスします。https://www.dotcpp.com/oj/problem1885.html
分析:
私たちは、カットがブロックKの数以上である場合には数xのいずれかが、xの正方形の辺の長さに合わせてカット10万個々の「チョコチャンク」に1の間であることを知っている、それぞれの子が持って実現することができますターゲットのコピー。私たちは、最大のxを探しています、
願いMAXX(最大値がマックスであれば、その後1とXとの間の任意の数マックスチョコレート四角辺の長さの通りである)と呼ばれます。問題は、一見大丈夫見ているようだが、近い分析、元の問題として理解することができます:1 100 000の間MAXXを見つけるために、
チョコレートはKより大きい等分に切断し、そのような側面MAXXセグメンテーションに従い、MAXX + 1にカット場合、Kはもはやブロックを切り出すことができないであろう。あなたは1から100000一つずつ、そして確かにタイムアウトするので、バイナリ検索を使用することから見れば。
それは半ば、それはより分割やチョコレートのKブロックの正方形に等しいする辺の長さであるかどうかを判断する方法は?N二次元アレイH [100000]及びW [100000] n個の要素に格納されているチョコレートのブロックの長さ及び幅とします。
(W / MID)*(H / MID)ので、n個のブロック:ブロックサイズチョコレートのH * W(長さH、幅W)であり、いくつかのチョコレート中間ブロックの辺の長さの正方形に切断することが可能であるのでブロックのチョコレートカット総カウント数は、次のように計算することができます。
int型CNT = 0;
以下のために(INT i = 1; iが<= N; iは++します)
{
CNT + =(H [I] / X)*(W [I] / X)。
}
Kに等しい場合よりも、CNTまたは明らかに、あなたがそうでなければ、切削、子どもたちに与えることができないチョコレートをカットすることができます。
1 #include <iostream> 2 #include <cstring> 3 4 using namespace std; 5 6 int n, k, a[110000], b[110000]; 7 8 bool ok(int x) 9 { 10 int cnt = 0; 11 for (int i = 1; i <= n; i++) 12 { 13 cnt += (a[i] / x)*(b[i] / x); 14 if (cnt >= k) 15 return true; 16 } 17 18 return false; 19 } 20 21 int main() 22 { 23 24 cin >> n >> k; 25 for (int i = 1; i <= n; i++) 26 cin >> a[i] >> b[i]; 27 28 int l = 0; 29 int r = 100004; 30 31 while (r - l > 1) 32 { 33 int m = (l + r) / 2; 34 if (ok(m)) 35 l = m; 36 else 37 r = m; 38 } 39 cout << l << endl; 40 41 return 0; 42 }