题目 代码 #include<bits/stdc++.h> using namespace std; const int N = 1e5+10; int n, k; int h[N], w[N]; bool check(int mid) { int cnt = 0; for(int i = 1; i <= n; i++) { cnt += (h[i] / mid) * (w[i] / mid); //切块一定是切出长方形洞才最省料,这样的话能切几块主要看横纵方向上分别有几个边长的长度 if(cnt >= k) return true; } return false; } int main() { cin >> n >> k; for(int i = 1; i <= n; i++) { cin >> h[i] >> w[i]; } int l = 1, r = N; //注意切块的范围为1到max(max(Hi), max(Wi)) < N while(l < r) { int mid = (l + r + 1) >> 1; if(check(mid)) l = mid; else r = mid - 1; } cout << l; return 0; }