int erf(int le, int ri) {//求满足条件的最大值
while (le + 1 <ri) {//防止死循环
int mid = le + ri >> 1;// ‘+‘优先级大于‘>>‘
if (check(mid))//check()函数:mid满足条件
le = mid;
else
ri = mid;
}
return le;
}
int erf(int le, int ri) {//求满足条件的最小值
while (le + 1 <ri) {//防止死循环
int mid = le + ri >> 1;// ‘+‘优先级大于‘>>‘
if (check(mid))//check()函数:mid满足条件
ri = mid;
else
le = mid;
}
return ri;
}
5 3 1 2 8 4 9
3
FJ can put his 3 cows in the stalls at positions 1, 4 and 8, resulting in a minimum distance of 3.
Huge input data,scanf is recommended.
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int n, c, a[100010];
int read() {
int noo1 = 0, noo2 = 1;
char ch = getchar();
while (ch<‘0‘ || ch>‘9‘) { if (ch == ‘-‘)noo2 = -1; ch = getchar(); }
while (ch >= ‘0‘&&ch <= ‘9‘) noo1 = noo1 * 10 + ch - ‘0‘, ch = getchar();
return noo1*noo2;
}
int check(int x) {
int cnt = 1,ans=a[0];//ans记录上一个安排的牛棚
for (int i = 1; i < n; i++) {
if (a[i] - ans >= x) {
cnt++;
ans = a[i];
}
if (cnt >= c)//如果满足条件,能安排下
return 1;
}
return 0;//不能安排下
}
int main() {
cin >> n >> c;
for (int i = 0; i < n; i++)
a[i]=read();
sort(a, a + n);//二分前提:单调性
int le = 0, r = a[n-1]-a[0];//确定边界
while (le+1 <r) {
int mid = le + r >> 1;
if (check(mid))//满足条件,向大找,看看比当前大还有没有满足的
le = mid;
else
r = mid;
}
cout << le << "\n";
return 0;
}
原文:https://www.cnblogs.com/52dxer/p/10389166.html