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;
}
作者:cherish.
出处:https://home.cnblogs.com/u/cherish-/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。