C/C++教程

AtCoder Beginner Contest 249题解

本文主要是介绍AtCoder Beginner Contest 249题解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

AtCoder Beginner Contest 249 A\(\sim\) D题解

A - Jogging

题目描述:A , B两人在散步,给你他们的速度和散步多少时间后需要休息多久,问到达指定时间后,谁走在前面。

思路:根据题意模拟即可

时间复杂度:\(O(1)\)

参考代码:

void solve() {
	auto cal = [](int a, int b, int c, int x)->int {
		int res = a * b * (x / (a + c));
		x %= (a + c);
		res += b * min(a, x);
		return res;
	};
	int a, b, c, d, e, f, x;
	string res = "Takahashi";
	cin >> a >> b >> c >> d >> e >> f >> x;
	int A = cal(a, b, c, x), B = cal(d, e, f, x);
	if (A < B) res = "Aoki";
	else if (A == B) res = "Draw";
	cout << res << '\n';
	return;
}

B - Perfect String

题目描述:给你一个字符串,若该字符串的所有字符都不相同,且不仅含有大写字母,还含有小写字母,则该字符串是wonderful

思路:根据题意模拟即可。

时间复杂度:\(O(n^2)\),\(n\)为字符串长度。

参考代码:

void solve() {
	string s;
	cin >> s;
	int n = s.size();
	auto check = [&](char ch)->bool {
		for (auto&& c : s) if (c >= ch && c <= ch + 25) return true;
		return false;
	};
	string res = "Yes";
	for (int i = 0; i < n; ++i) {
		for (int j = i + 1; j < n; ++j) {
			if (s[i] != s[j]) continue;
			res = "No";
		}
	}
	if (!check('a') || !check('A')) res = "No";
	cout << res << '\n';
	return;
}

C - Just K

题目描述:给你\(N\)个字符串和一个数字\(K\),求从这\(N\)个字符串中选出一些字符串所组成的所有子集中,满足集合中字符出现次数为\(K\)的数量的最大值。

思路:考虑到\(N\)很小,暴力枚举即可

时间复杂度:\(O(26 \times 2^N)\)

参考代码:

void solve() {
	int n, k;
	cin >> n >> k;
	vector<string>strs(n);
	for (int i = 0; i < n; ++i) cin >> strs[i];
	vector<int>cnt(26, 0);
	int res = 0;
	auto dfs = [&](auto&& dfs, int cur)->void {
		if (cur == n) {
			int ct = 0;
			for (auto&& c : cnt) ct += c == k;
			res = max(res, ct);
			return;
		}
		dfs(dfs, cur + 1);
		for (auto&& c : strs[cur]) cnt[c - 'a']++;
		dfs(dfs, cur + 1);
		for (auto&& c : strs[cur]) cnt[c - 'a']--;
		return;
	};
	dfs(dfs, 0);
	cout << res << '\n';
	return;
}

D - Index Trio

题目描述:给你一个长度为\(n\)的序列\(A\),求满足等式\(\frac{A_i}{A_j} = A_k\)的三元组\((i ,j , k)\)的数量。

思路:考虑到数据范围很小,直接暴力枚举\(A_k\)即可。

时间复杂度:\(O(mlogm)\) ,其中\(m = \mathop{max}\limits_{i = 1}^{n}\{a_i\}\)。

参考代码:

void solve() {
	int n, a;
	const int N = 2e5 + 5;
	vector<int>cnt(N + 1, 0);
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> a, cnt[a]++;
	long long res = 0;
	for (int i = 1; i < N; ++i) {
		if (cnt[i] == 0) continue;
		for (int j = i; j < N; j += i) {
			int dy = j / i;
			res += 1ll * cnt[i] * cnt[j] * cnt[dy];
		}
	}
	cout << res << '\n';
	return;
}
这篇关于AtCoder Beginner Contest 249题解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!