其他分享
首页 > 其他分享> > 二分

二分

作者:互联网

# 二分

# 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