革命尚未成功

————同志仍需努力————

shinnyblue

导航

分巧克力 | 二分

 

 

P8647 [蓝桥杯 2017 省 AB] 分巧克力 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

一图说清下述两种代码孰对孰错的原因:

 

 

错误代码:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define ios_base \
    ios::sync_with_stdio(false);\
    cin.tie(nullptr),cout.tie(nullptr)
const int N =1e5+10;
int n,k,t1,t2=3e6;          //***
int h[N],w[N];
bool check(int mid);
int main()
{
    ios_base;
    cin>>n>>k;
    for (int i = 0; i < n; i++)
    {
        cin>>h[i]>>w[i];
        t1=min(h[i],w[i]);  //***
        t2=min(t2,t1);      //***
    }
    int l=1,r=t2;//***
    while (l<r)
    {
        int mid=l+r+1>>1;//如果tle多半是此处写错,作+1修正即可(mid=l+r+1>>1)
        if(check(mid))
        {
            l=mid;
        }
        else r=mid-1;
    }
    cout<<r;
    return 0;
}
bool check(int mid)
{
    int num=0;//num表示在巧克力边长为mid的情况下能分给多少个小朋友
    for (int i = 0; i < n; i++)
    {
        num+=(h[i]/mid)*(w[i]/mid);
        if (num>=k) return true;
    }
    return false;
}

 

正确代码:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define ios_base \
    ios::sync_with_stdio(false);\
    cin.tie(nullptr),cout.tie(nullptr)
const int N =1e5+10;
int n,k;
int h[N],w[N];
bool check(int mid);
int main()
{
    ios_base;
    cin>>n>>k;
    for (int i = 0; i < n; i++)
    {
        cin>>h[i]>>w[i];
    }
    int l=1,r=5e6;                    
    while (l<r)
    {
        int mid=l+r+1>>1;//如果tle多半是此处写错,作+1修正即可(mid=l+r+1>>1)
        if(check(mid))
        {
            l=mid;
        }
        else r=mid-1;
    }
    cout<<r;
    return 0;
}
bool check(int mid)
{
    int num=0;//num表示在巧克力边长为mid的情况下能分给多少个小朋友
    for (int i = 0; i < n; i++)
    {
        num+=(h[i]/mid)*(w[i]/mid);
        if (num>=k) return true;
    }
    return false;
}

 

posted on 2023-04-03 23:39  ShinnyBlue  阅读(12)  评论(0编辑  收藏  举报

Live2D