二分查找
1.查找大于等于x的最小值
#include<iostream>
using namespace std;
const int MAXN = 1e6 + 7;
int num[MAXN];
int n;
int binary(int x)
{
int ans = -1;//-1说明ans不存在
int left = 0, right = n - 1;
int mid;
while (left <= right)
{
mid = (left + right) / 2;
if (num[mid] >= x)
{
ans = num[mid];
right = mid - 1;
}
else
left = mid + 1;
}
return ans;
}
int main()
{
int x;
cin >> n >> x;
for (int i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
cout << binary(x) << endl;
return 0;
}
查找重复数组中x的最小下标
int binaryindex(int x)
{
int ans = -1;
int left = 0, right = n - 1;
int mid;
while (left <= right)
{
mid = (left + right) / 2;
if (num[mid] >= x)
{
ans =mid;
right = mid - 1;
}
else
left = mid + 1;
}
return ans;
}
int main()
{
int x;
cin >> n >> x;
for (int i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
if (num[binaryindex(x)] == x)//判断找到的下标对应的值是否是x
{
cout << binaryindex(x) << endl;
}
return 0;
}
二分答案
这些值 1 2 3 4 5 6 7
对应 1 1 1 1 0 0 0 要找到符合条件的最大值
进击的奶牛
link.
题目描述
Farmer John 建造了一个有 N(2<=N<=1000000)个隔间的牛棚,这些隔间分布在一条直线上,坐标是 x1x_1x1 ,…,xNx_NxN(0<xi<1000000000),他的c(2<c<n)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John 想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?
输入格式
第 1 行:两个用空格隔开的数字 N 和 C。
第 2 ~ N+1 行:每行一个整数,表示每个隔间的坐标
输出格式
输出只有一行,即相邻两头牛最大的最近距离。
输入
5 3
1
2
8
4
9
输出
3
计算最大的最近距离
1.再dis下可以放几头牛(首先先排序)
2.判断是否等于c
3.用二分法找到最小值
#include<iostream>
using namespace std;
int N, C;
const int MAXN = 1e7 + 6;
int arr[MAXN];
int comp(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int coutcow(int dis)
{
int now = arr[0];
int i = 1;
int cnt = 1;
for (i = 1; i < N; i++)
{
if (arr[i] - now >= dis)
{
cnt++;
now = arr[i];
}
}
return cnt;
}
bool beyondC(int dis)
{
return coutcow(dis) >= C;
}
int binary()
{
int left = 1, right = 1e9;
int ans = -1;
int mid;
while (left <= right)
{
mid = (left + right) / 2;
if (beyondC(mid))
{
ans = mid;
left = mid + 1;
}
else
right = mid - 1;
}
return ans;
}
int main()
{
cin >> N >> C;
int i = 0;
for (i = 0; i < N; i++)
{
scanf("%d", &arr[i]);
}
qsort(arr, N, sizeof(int), comp);
cout << binary() << endl;
return 0;
}
皮皮的糖果
皮皮有n包不同口味的糖果,分给每个人糖果的 数量必须相等,并且每个人只能有一种口味,也就是说,可以把一包糖分给多个人,但是一个人的糖不能有多少口味,每个人最多能分到几颗糖
#include<iostream>
using namespace std;
const int MAXN = 1e6 + 7;
int arr[MAXN];
int n, m;
int count(int b)
{
int sum = 0;
int i = 0;
for (i = 0; i < n; i++)
{
sum += arr[i] / b;//sum计算在分b个糖果的情况下可有多少个人
}
return sum;
}
bool check(int b,int m)
{
return count(b) >= m;
}
int binary(int& n, int& m)
{
int left = 1, right = 1e6;
int mid;
int ans = 1;
while (left <= right)
{
mid = (left + right) / 2;
if (check(mid,m))
{
ans = mid;
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return ans;
}
int main()
{
//n种口味,m个人
int t;
cin >> t ;
while (t--)
{
cin >> n >> m;
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int min = arr[0];
cout<<binary( n, m)<<endl;
}
return 0;
}