Bootstrap

1227. 分巧克力(简单,易懂)

 

输入样例:
2 10
6 5
5 6
输出样例:
2

这个题就是基础的二分问题,做题思路:

找到一个数,让其满足,所有小块的边值,且最终的总和要大于等于我们的K 

第一次做错了!! 

#include<iostream>
using namespace std;
#define x first
#define y second
const int N=1e5+10;
int n,k,Min=0x3f3f3f3f;
pair<int,int> a[N];
bool check(int t)
{
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        cnt+=(a[i].x/t)*(a[i].y/t);
    }

    if(cnt>=k) return true;
    else return false;
}
int main()
{
    cin>>n>>k;
    
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].x>>a[i].y;
        Min=min(Min,min(a[i].x,a[i].y));
//我选择了最小值但忘记了一种情况
//假设k=2
//1 5
//10 10
//呢么如果我直接选了最小的1作为二分找边的右边界,呢么答案就是1,其实答案是5
    }

    int l=1,r=Min;
    while(l<r)
    {
        int mid=l+r+1>>1;
        if(check(mid))
        {
            l=mid;
        }
        else r=mid-1;
    }
    cout<<l;
    return 0;
}

第二次AC 

#include<iostream>
using namespace std;
#define x first
#define y second
const int N=1e5+10;
int n,k,Max=-1;
pair<int,int> a[N];
bool check(int t)
{
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        cnt+=(a[i].x/t)*(a[i].y/t);
    }

    if(cnt>=k) return true;
    else return false;
}
int main()
{
    cin>>n>>k;
    
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].x>>a[i].y;
        Max=max(Max,max(a[i].x,a[i].y));//这里我将边界换成了最大值
    }

    int l=1,r=Max;
    while(l<r)
    {
        int mid=l+r+1>>1;
        if(check(mid))
        {
            l=mid;
        }
        else r=mid-1;
    }
    cout<<l;
    return 0;
}

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;