AtCoder Beginner Contest 002
A
输入两个正整数,输出更大的整数。
那么输出 \(max(a, b)\) 就行。
B
题意
给一个小写字符串 \(s\) ,输出去掉元音字母 \(aeiou\) 得到的新字符串。
题解
可以用 \(O(n)\) 做到,常数是 \(5\) 。
std::string s; std::cin >> s;
std::string t = "aeiou";
std::string str = "";
for (auto x : s) {
if (t.find(x) == std::string::npos)
str += x;
}
std::cout << str << "\n";
C
题意
给定三角形的三个点的坐标 \(A(x_1, y_1), B(x_2, y_2), C(x_3, y_3)\) ,求这个三角形的面积。相对误差或绝对误差 \(\leq 10^{-2}\) 。
题解
求多边形面积能很快想到叉积。
\(\overrightarrow{AB} = (x_2 - x_1, y_2 - y_1), \overrightarrow{AC} = (x_3 - x_1, y_2 - y_1)\) 。
\[\triangle_{ABC}
= |\frac{1}{2} \times \overrightarrow{AB} \times \overrightarrow{AC}|
= | \frac{1}{2}
\begin{vmatrix}
x_{AB} & x_{AC} \\
y_{AB} & y_{AC} \\
\end{vmatrix} |
= | \frac{1}{2} (x_{AB} \times y_{AC} - x_{AC} \times y_{AB}) |
\]
中间浮点数转化用 long double 会好一些。
view
int x[3], y[3];
for (int i = 0; i < 3; i++) {
std::cin >> x[i] >> y[i];
}
int X[2], Y[2];
X[0] = x[1] - x[0];
Y[0] = y[1] - y[0];
X[1] = x[2] - x[0];
Y[1] = y[2] - y[0];
double ans = fabs( (long double)(X[0] * Y[1] - X[1] * Y[0]) / 2 );
std::cout << std::fixed << std::setprecision(10) << ans << "\n";
加强版。求多边形面积。
如果以逆时针给出 \(n\) 个点 \((x_0, y_0), (x_1, y_1), \cdots, (x_{n - 1}, y_{n - 1})\) 确定一个多边形,如何得到这个多边形的面积?
答案是
\[\frac{1}{2} \sum_{i = 0}^{n - 1}
\begin{vmatrix}
x_i & x_{(i + 1) \bmod n} \\
y_i & y_{(i + 1) \bmod n} \\
\end{vmatrix}
= \frac{1}{2} \sum_{i = 0}^{n - 1} x_{i} \times y_{(i + 1) \bmod n} - x_{(i + 1) \bmod n} \times y_{i}
\]
如果顺时针给出则取负号。
时间复杂度 \(O(n)\) 。
D
diffculty 1418
题意
给 \(n\) 个点 \(m\) 条边。
询问最大的 \(m\) 使图中存在一个导出子图是完全图 \(K_m\) 。
\(2 \leq n \leq \leq 12, m \leq \frac{n(n + 1)}{2}\)
题解
可以 \(2^{n}\) 枚举一个导出子图,然后 \(n^{2}\) 检查是否为完全图。其中两个点是否存在边,使用邻接矩阵存储可以 \(O(1)\) 检查。
(OobugoO 出过类似的题目啊……就是枚举一个导出子图,然后检查是否子图内每个点的距离都大于某个值。)
view
#include <bits/stdc++.h>
typedef long long i64;
// ~~ SEG STARST
// ~~ SEG END
void solve() {
int n, m; std::cin >> n >> m;
std::vector<std::vector<int> > g(n + 1, std::vector<int>(n + 1));
for (int i = 1; i <= m; i++) {
int u, v; std::cin >> u >> v;
g[u][v] = g[v][u] = 1;
}
int ans = 0;
for (int mask = 0; mask < (1 << n); mask++) {
int ok = 1;
for (int i = 0; i < n; i++) if (mask >> i & 1) {
for (int j = i + 1; j < n; j++) if (mask >> j & 1) {
ok &= g[i + 1][j + 1] == 1;
}
}
if (ok)
ans = std::max(ans, __builtin_popcount(mask));
}
std::cout << ans << "\n";
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("IO/in", "r", stdin); freopen("IO/out", "w", stdout);
#endif
std::cin.tie(0); std::ios::sync_with_stdio(false);
int _ = 1; // std::cin >> _;
while (_--) { solve(); }
return 0;
}
——永远是挑战而不是练习,下次一定更好。
浙公网安备 33010602011771号