做了两题二分发现数据限制都在1e5,以后可以尝试用数据推方法
二分模版 指路不需要考虑mid+1、mid-1的二分查找模板,希望大家都能学会_mid-1 mid+1-CSDN博客
感恩大佬简单方便的模版
int L=-1,R=n;
while(L+1!=R)
{
int mid=L+R>>1;
if(check()) L=mid;
else R=mid;
//最后根据你所分左右两边区间的结果
//选取L或者R作为结果
}
但是我在2017-省赛题目中用这个模版是有一组数据过不了的 改成了R=n+1就可以了
#include <iostream>
#include <algorithm>
using namespace std;
int a[100005];
int Min; int n,k;
bool check(int mid)
{
int sweep=0;
for(int i=1;i<=k;i++)
{
if(a[i]-mid<=sweep)
{
if(a[i]<=sweep)
sweep=mid-1+a[i];
else
sweep+=mid;
}
else
return false;
}
return sweep>=n;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=k;i++)
cin>>a[i];
sort(a+1,a+k+1);
int l=-1,r=n+1;
while(l+1!=r)
{
int mid=(l+r)/2;
if(check(mid))
{
r=mid;
Min=mid;
}
else
{
l=mid;
}
}
cout<<(Min-1)*2;
return 0;
}
同样的经过测试 修改的模版也可以在2019-省赛 题中通过所有样例 1.分巧克力 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/99/learning/?page=1&first_category_id=1&second_category_id=3&tags=%E4%BA%8C%E5%88%86&status=2
#include <iostream>
using namespace std;
int h[100005], w[100005];
int n, k, ans;
bool check(int mid)
{
int kk = 0;
for (int i = 1; i <= n; i++)
{
kk += (h[i] / mid) * (w[i] / mid);
}
if (kk >= k)
return true;
else
return false;
}
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> h[i] >> w[i];
}
int l = -1, r = 100001;
int mid;
while (l+1 != r)
{
mid = (l + r) / 2;
if (check(mid))
{
l = mid ;
ans = mid;
}
else
{
r = mid ;
}
}
cout << ans;
return 0;
}