补题连接:Hereios
对 \(N\) 进行奇偶判断,奇数穿 Black
、偶数穿 White
c++
前 \(n\) 项和公式:\(S_n = \frac{n(a_1 + a_n)}{2}\)ui
简单套公式计算便可。spa
注意点:使用 long long
.net
题意:给 N 组坐标,判断这些坐标中,是否存在三个不一样点处于同一条直线。若是存在,输出 Yes,不然输出 No。code
本题是一个数学题,假设咱们有三个点,坐标分别为:点 A 为 (x1, y1)、点 B 为 (x2, y2) 和点 C 为 (x3, y3)。orm
判断三点共线blog
假设这三个点共线,则排序
这样咱们能够变换为ci
因为本题数据范围较小能够暴力遍历
#include <bits/stdc++.h> using namespace std; typedef struct _POS { int x; int y; } POS; const int MAXN = 1e2 + 4; POS arr[MAXN]; int main() { int n; cin >> n; for (int i = 1; i <= n; i++) cin >> arr[i].x >> arr[i].y; //暴力枚举 for (int i = 1; i <= n - 2; i++) for (int j = i + 1; j <= n - 1; j++) for (int k = j + 1; k <= n; k++) if ((arr[k].x - arr[i].x) * (arr[j].y - arr[i].y) == (arr[j].x - arr[i].x) * (arr[k].y - arr[i].y)) { cout << "Yes\n"; return 0; } cout << "No\n"; return 0; }
核心在于 整数是否能被 \(8\) 整除都取决于后三位
题意:给定一个字符串(由 1
~ 9
构成),请问是否能经过重排序来使这个字符串整数为 \(8\) 的倍数。
思路:
在数学问题上,有如下是成立的
一般,为 \(2^k\) 的倍数等效于使最后 \(k\) 个数字为 \(2^k\) 的倍数。 让我简要地展现8的倍数的状况。
\(1000 = 2^3 \times 5^3\)
注意:\(1000\) 可被 \(8\) 整除,所以,对于任何整数 \(n\) ,可令 \(q\) 为 \(n\) 除以 \(1000\) 的商,\(r\) 为余数
即:\(n = 1000q + r\)
故此,\(r\) 刚好为 \(n\) 的最后三位数。
此时:\(n \equiv 1000q + r \equiv (\ mod\ 8)\)
如今回到原来的问题上;
关于 S 是否为 8 的倍数,咱们进行分状况讨论
\(|S| \le 3\) 的状况咱们能够直接全排列
\(|S| > 4\) 的状况咱们能够考虑以下。
考虑 \(8\) 的倍数的全部可能的后三位数字。 肯定是否能够从 \(S\) 知足它们中的任何一个。
实际上 \(1000\) 之内的 \(8\) 的倍数仅 124个,因此运行速度会很快
#incwlude <bits/stdc++.h> using namespace std; using ll = long long; bool solve(string S) { if (S.size() <= 5) { sort(S.begin(), S.end()); do { int val = 0; for (auto c : S) val = val * 10 + (int)(c - '0'); if (val % 8 == 0) return true; } while (next_permutation(S.begin(), S.end())); return false; } vector<int> all(10, 0); for (const auto c : S) all[c - '0']++; for (int i = 0; i < 1000; i += 8) { vector<int> num(10, 0); int i2 = i; for (int iter = 0; iter < 3; ++iter) { num[i2 % 10]++; i2 /= 10; } bool ok = true; for (int v = 0; v < 10; ++v) if (num[v] > all[v]) ok = false; if (ok) return true; } return false; } int main() { ios_base::sync_with_stdio(false), cin.tie(0); string s; cin >> s; cout << (solve(s) ? "Yes" : "No"); return 0; }
题意:
给出 N个整数,且N为奇数,回答M个回答
数据范围:
思路:
https://blog.csdn.net/justidle/article/details/109509824
#include <bits/stdc++.h> using namespace std; using ll = long long; template <class T> void chmax(T &a, T b) { if (a < b) a = b; } template <class T> void chmin(T &a, T b) { if (a > b) a = b; } const ll inf = 1LL << 60; int main() { ios_base::sync_with_stdio(false), cin.tie(0); int N, M; cin >> N >> M; vector<ll> X(N), W(M); for (ll &x : X) cin >> x; for (ll &x : W) cin >> x; sort(X.begin(), X.end()); vector<ll> left(N + 1, 0), right(N + 1, 0); for (int i = 2; i < N; i += 2) { left[i] = left[i - 2] + X[i - 1] - X[i - 2]; right[i] = right[i - 2] + X[N - i + 1] - X[N - i]; } ll ans = inf; for (auto w : W) { int i = lower_bound(X.begin(), X.end(), w) - X.begin(); if (i % 2 == 0) chmin(ans, left[i] + right[N - i - 1] + X[i] - w); else chmin(ans, left[i - 1] + right[N - i] + w - X[i - 1]); } cout << ans << '\n'; return 0; }
有一个 \(200×2×10^9\) 的网格,其中横坐标区间为 [−100,100]
,纵坐标区间为 \([−10^9,10^9]\)。平面上有若干个点。
你有一个圆,最开始在 \((0,−10^9)\),询问圆半径最大是多少使得它能够在不接触点的状况下圆心到达 \((0,10^9)\)。
思路:
二分圆的直径,若是两个点之间的距离小于直径,那么显然圆无法从这两个点之间通过。注意要把直线 \(x=100\) 和\(x=−100\) 也看作一个点。
那么若是连完线以后把直线 \(x=100\) 和 \(x=−100\) 联通,那么至关于存在若干连线将左右两边隔开,这样圆就没法过去。不然能够到达。
用并查集维护便可。
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; using Edge = pair<double, pii>; struct UnionFind { vector<int> par; UnionFind(int n) : par(n, -1) {} void init(int n) { par.assign(n, -1); } int find(int x) { return par[x] < 0 ? x : par[x] = find(par[x]); } bool issame(int x, int y) { return find(x) == find(y); } void merge(int x, int y) { x = find(x), y = find(y); if (x != y) { if (par[x] > par[y]) swap(x, y); par[x] += par[y]; par[y] = x; } } }; int main() { ios_base::sync_with_stdio(false), cin.tie(0); int N; cin >> N; vector<double> x(N), y(N); for (int i = 0; i < N; ++i) cin >> x[i] >> y[i]; auto calc = [&](int i, int j) -> double { return sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])); }; vector<Edge> edges; int s = N, t = N + 1; for (int i = 0; i < N; ++i) { edges.push_back(Edge(100.0 - y[i], pii(s, i))); edges.push_back(Edge(100.0 + y[i], pii(t, i))); for (int j = i + 1; j < N; ++j) { edges.push_back(Edge(calc(i, j), pii(i, j))); } } sort(edges.begin(), edges.end()); UnionFind uf(N + 2); double res = 0.0; for (auto e : edges) { uf.merge(e.second.first, e.second.second); if (uf.issame(s, t)) { res = e.first / 2; break; } } cout << fixed << setprecision(10) << res << endl; return 0; }