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;
}
posted @ 2024-07-15 00:25  03Goose  阅读(21)  评论(0)    收藏  举报