二分查找
二分查找查找值k
如果找到返回该值,如果未找到返回-1。
int binary_search(int l, int r, int k)
{
while(l <= r){
int mid = l + r >> 1;
if(a[mid] < k) l = mid + 1;
else if(a[mid] > k) r = mid - 1;
else return mid;
}
return -1;
}
二分查找查找大于等于k的最小值
int binary_search(int l, int r, int k)
{
while(l < r){
int mid = l + r >> 1;
if(a[mid] < k) l = mid + 1;
else r = mid;
}
return l;
}
二分查找查找小于等于k的最大值
int binary_search(int l, int r, int k){
while(l < r){
int mid = l + r >> 1;
if(a[mid] < k) l = mid;
else r = mid - 1;
}
return r;
}
lower_bound()和upper_bound()
lower_bound()返回值是一个迭代器,返回指向大于等于k的第一个值的位置
upper_bound()返回大于key的第一个元素的位置
浮点数二分
用于判断一个区间中哪个浮点数更成立的。
由于是浮点数,精度由题目决定。
题目
有N根绳子,第i根绳子长度为Li,现在需要M根等长的绳子,你可以对N根绳子进行任意裁剪(不能拼接),请你帮忙计算出这M根绳子最长的长度是多少。
输入格式
第一行包含2个正整数N、M,表示原始绳子的数量和需求绳子的数量。
第二行包含N个整数,其中第 i 个整数Li表示第 i 根绳子的长度。
输出格式
输出一个数字,表示裁剪后最长的长度,保留两位小数。
数据范围
1≤N,M≤100000,
0<Li<109
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int n, m;
int w[N];
bool check(double mid)
{
int cnt = 0;
for(int i = 0; i < n; i ++)
cnt += w[i] / mid;
return cnt >= m;
}
int main()
{
cin >> n >> m;
for(int i = 0; i < n; i ++) cin >> w[i];
double l = 0, r = 1e9;
while(r - l > 1e-4)
{
double mid = (l + r) / 2;
if(check(mid)) l = mid;
else r = mid;
}
printf("%.2f", r);
}