二分题总结

发布时间 2023-12-15 11:37:43作者: iscr

【1】保护大地球 题目链接

地球是一个坐标平面,您的任务是保护它。 google earth 给定 K (地球上的人数),你必须制作一个保护罩来保护他们。 求以坐标 (0, 0) 为圆心的圆,且能容纳 K 个人的最小的圆的半径。已知一个人只能站在整数坐标上,且 两个人不能站在同一位置。 注 1:一个人可以站在圆的中心。 注 2:如果一个人站在圆环内或圆环的边界,他将被视为受到保护。

Input 唯一一行包含一个整数 K(2 ≤ K ≤ 109 ) - 地球上的人口数量。 Output 打印一个整数:保护地球上 K 个人所需的最小整数圆半径。

 1 //
 2 //#pragma GCC optimize("Ofast")
 3 //#pragma GCC optimize("unroll-loops")
 4 #define _CRT_SECURE_NO_WARNINGS
 5 #define All(a) a.begin(),a.end()
 6 #define INF 2147483647
 7 #include<bits/stdc++.h>
 8 #include<numeric>
 9 using namespace std;
10 typedef unsigned long long ull;
11 #define int long long//再也不用担心开longlong了><
12 typedef pair<int, int>PII;
13 int n;
14 bool f(int x) {
15     int res = 0;
16     for (int i = 0; i < x; i++) {
17         res += floor(sqrt(x * x - i * i));
18     }
19     return res * 4 + 1 >= n;
20 }
21 int find() {
22     int l = -1, r = 1e7 + 1;
23     while (l + 1 < r) {
24         int mid =(r-l)/2+l;
25         if (f(mid))r = mid;
26         else l = mid;
27     }
28     return r;
29 }
30 signed main() {
31     ios::sync_with_stdio(false);
32     cin.tie(nullptr);
33     cout.tie(nullptr);
34     cin >> n;
35     cout << find();
36 }

总结:计算一个圆内整数点个数方法:利用x==y(正方形),下取整(妙),以及反求法,复杂度O(N)

1 int cal(int u) {
2     int res = 0;
3     for (int i = 0; i < u; i++) {
4         res += floor(sqrt(u * u - i * i));
5     }
6     return res*4+1;
7 }