二分

https://www.acwing.com/problem/content/1229/

思路:

1.由于所有的巧克力都必须是形状相同的正方形,所以要考虑分割时巧克力的边长,尤其要注意给你的巧克力可以不使用

2.由于给出了长和宽,所以可以用pair或结构体数组来存,不建议使用整数数组存放,用pair或结构体数组的好处是可以用sort函数快速排序

3.在输入时要限定first 存宽, 有利于两个数据的比较

4.分巧克力时限定巧克力边长的是宽,所以枚举宽度就行,由于之前已经排好序,宽度是非递减序列,所以使用二分法就可以快速定位最大长度

#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;可以有效防止死循环

posted @ 2021-02-22 23:29  kanbujian55  阅读(81)  评论(0)    收藏  举报