要写二分要知道的模板
int Bianry_Search(int x)
{
int l = 1,r =n;
while (l < r)
{
int mid = (l + r)>>1;// 类似于除2
if (a[mid] >=x)
{
r = mid;//如果大于查找值,右边的直接过来
}
else
l = mid+1;
}
if (a[l] == x)return l;//如果等于则返回,r和l都可以
else return -1;
}
意思相当于从两边不断压缩
上题目
思路: 切成六分,每份的最小大小为5.现在要求的就是切从成多少份才能使最小长度为7,那么现在要变动的就是切成几份。
木材累加除上他的份数可得到他的平均值,也就是分成几份后的最小值。
那么要变动的就是mid,除木材然后累加,直到临时变量等于最小值。就说明找到了,输出l或者r都可以。
代码
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
const int N = 1e6 + 10;
int a[100005];
int main()
{
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int l = 0, r = 100000000;
while (l <= r && r != 0)
{
int temp = 0;
int mid = l + (r - l) / 2;
for (int i = 0; i < n; i++)temp += a[i] / mid;
if (temp >= k)
{
l = mid + 1;
}
else r = mid - 1;
}
cout << r;
return 0;
}