蓝桥集训之分巧克力
-
核心思想:二分
- 若mid边长可以分出来 则<mid边长的也能分出来
- 所以考虑二分 找到最大的边长
- 将所有mid边长能分的个数求和 –> 大于人数则可行
-
#include<iostream> using namespace std; const int N = 100010; typedef long long LL; int h[N],w[N]; int n,m; bool check(int mid) { LL res = 0; for(int i=0;i<n;i++) { res += (LL) h[i]/mid *(w[i]/mid); //求mid边长可分的个数 if(res >= m) return true; //大于人数说明够分 } return false; } int main() { cin>>n>>m; for(int i=0;i<n;i++) cin>>h[i]>>w[i]; int l=1,r = 1e5; while(l<r) { int mid = l + r + 1>>1; if(check(mid)) l = mid; else r = mid-1; } cout<<r; }