二分
作者:互联网
# 二分
# https://www.acwing.com/problem/content/1229/
思路:
1.由于所有的巧克力都必须是形状相同的正方形,所以要考虑分割时巧克力的边长,尤其要注意给你的巧克力可以不使用
2.由于给出了长和宽,所以可以用pair或结构体数组来存,不建议使用整数数组存放,用pair或结构体数组的好处是可以用sort函数快速排序
3.在输入时要限定first 存宽, 有利于两个数据的比较
4.分巧克力时限定巧克力边长的是宽,所以枚举宽度就行,由于之前已经排好序,宽度是非递减序列,所以使用二分法就可以快速定位最大长度
```c++
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
pair<int , int> cho[N];
bool operator<(pair<int , int> a, pair<int , int> b)
{
return a.first < b.first;
}
int main()
{
int n, k;
int a, b;
cin >> n >> k;
for(int i = 0; i < n; i ++)
{
cin >> a >> b;
cho[i].first = min(a, b);
cho[i].second = max(a, b);
}
sort(cho, cho + n);
int l = cho[0].first, r = cho[n - 1].first;
int mid;
int res = 0;
while(l <= r)
{
int ans = 0;
mid = (r + l)/ 2;
for(int i = 0; i < n; i ++)
ans += (cho[i].first / mid ) * (cho[i].second / mid );
if(ans >= k)
{
l = mid + 1;
res = res > mid ? res : mid;
}
else r = mid - 1;
}
cout << res;
return 0;
}
```
## 注意使用sort函数时需要重定义 <
## l = mid + 1;r = mid - 1;可以有效防止死循环
标签:二分,int,res,mid,cho,pair,first 来源: https://www.cnblogs.com/fengzhaoning/p/14433594.html