这道题求的是在满足特定情况下的最大值,容易得到当巧克力的边长
越长时,那么切出来的巧克力数量就会越小。在这种情况下,如果想
要分出的巧克力边长最大,那么考虑到这种情况不难得到二分法对这
题很适合,只需要不断枚举中间值,最后就能求出最大值。
这道题和洛谷的这道砍树的题目很类似。
这两道题都要记录一下对于每块巧克可以切多少,然后将其记录下来,
最后进行判断是否满足条件。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 const int N = 1e5 + 10; 6 int h[N], w[N], n, k; 7 bool check(int mid){ 8 int cnt = 0; 9 for(int i = 1; i <= n; i ++) 10 if(h[i] >= mid && w[i] >= mid) 11 cnt += (h[i] / mid) * (w[i] / mid); 12 if(cnt >= k) return true; 13 else return false; 14 } 15 int main(){ 16 scanf("%d%d", &n, &k); 17 for(int i = 1; i <= n; i ++) scanf("%d%d", &h[i], &w[i]); 18 int l = 1, r = 1e5, ans = 0; 19 while(l < r){ 20 int mid = l + r + 1 >> 1; 21 if(check(mid)) l = mid; 22 else r = mid - 1; 23 } 24 cout << l << endl; 25 return 0; 26 }