double l = 0, r = x; while(r - l > 1e-6) { double mid = (l + r) /2; if(mid * mid >= x) r = mid; else l = mid; }
printf("%lf\n", l);
return0; }
另外再写上个函数式模板
1 2 3 4 5 6 7 8 9 10
intbsearch_1(int l, int r) { while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; else l = mid + 1; } return l; }
补一道题目 愤怒的牛 初看题目,并不觉得和二分有关 但是再看,题目的要求是求出最大的最小距离值 也就是一个数 n ,使所有牛之前的距离都大于 n,求n的最大值 既然这些都知道了,那先简单写一个check函数
1 2 3 4 5 6 7 8 9 10 11 12
boolcheck(int mid) { int num = 1; int way = cow_house[1] + mid; for(int i = 2; i <= n ; i ++) { if(cow_house[i] < way) continue; num ++; way = cow_house[i] + mid; } return num >= m; }
boolcheck(int mid) { int num = 1; int way = cow_house[1] + mid; for(int i = 2; i <= n ; i ++) { if(cow_house[i] < way) continue; num ++; way = cow_house[i] + mid; } return num >= m;
}
intinsert(int l, int r) { while(l <= r) { int mid = (l + r ) >> 1; if(check(mid)) l = mid+1; else r = mid-1; }
return r; }
intmain() { cin >> n >> m ; for(int i = 1; i <= n; i ++) { cin >> cow_house[i]; } sort(cow_house + 1,cow_house+n+1); cout << insert(1, cow_house[n]);