前言
本系列是我学习完大佬的方法后,为了蓝桥杯前几天可以快速过一遍所做,所以部分内容会很简洁。如果能够帮助到你,我也会很开心!!!
模版
整数二分
int Mid(int a,int b)
{
int l=1;
int r=1e9+10;
while(l<r)
{
int mid=l+r>>2;//int mid=l+r+1>>2;看情况选择
if(a/mid<=b)//这儿一般情况下看需要用mid判断什么条件
r=mid;//l=mid;
else
l=mid+1;//r=mid-1;
}
return l;
}
浮点数二分
int Mid(int a,int b)
{
double l=0;
double r=1e9+10;
double eps=1e-6;//精度 这是浮点数不同于整数二分的一个
while(r-l>=1e6)
{
double mid=l+r>>2;
if(判断条件)//这儿一般情况下看需要用mid判断什么条件
r=mid;
else
l=mid;
}
return r;
}
其他类型二分
结合上面的二分加check函数(if(check函数)r=mid....)
练题
冶炼金属
题目截图
冶炼金属解题
#include <bits/stdc++.h>
using namespace std;
#define N 10010
int n;
int Mid(int a,int b)
{
int l=1;
int r=1e9+10;
while(l<r)
{
int mid=(l+r)/2;
if(a/mid<=b)
r=mid;
else
l=mid+1;
}
return r;
}
int main()
{
cin>>n;
int minv=1;
int maxv=1e9;
int a,b;
for(int i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
minv = max(minv, Mid(a, b));
maxv = min(maxv, Mid(a, b - 1) - 1);
}
cout << minv << " " << maxv;
return 0;
}
冶炼金属亮点
for(int i=0;i<n;i++)
{
scanf("%d%d",&a,&b);//一边输入一边判断的方法可以学学
minv = max(minv, Mid(a, b));
maxv = min(maxv, Mid(a, b - 1) - 1);
}
卡牌
题目截图
题目思路
用二分的知识点来解题,主要是check函数难想,加深练习再发上来