log算法

文章目录

二分查找

1.查找大于等于x的最小值

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

#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的最小下标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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.用二分法找到最小值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#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包不同口味的糖果,分给每个人糖果的 数量必须相等,并且每个人只能有一种口味,也就是说,可以把一包糖分给多个人,但是一个人的糖不能有多少口味,每个人最多能分到几颗糖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#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;
}

log算法
http://example.com/2022/01/13/log算法/
作者
Zevin
发布于
2022年1月13日
许可协议