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