难度分类(同一难度下按字典序上升)
- 入门: C
- 简单: G, D
- 中等: E, H, F, A
- 困难: B
C-解题思路
数一下每个字母的数量看是不是偶数就可以得到答案。
C-代码实现
#include <bits/stdc++.h>int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);std::string s;std::cin >> s;std::vector<int> c(26);for (auto ch: s) {c[ch - 'a']++;}int f = 1;for (auto x: c) {if (x % 2) {f = 0;break;}}if (f) {std::cout << "Yes";} else {std::cout << "No";}
}
G-解题思路
直接用梯形面积公式计算即可,注意数据范围, \((a+b)*h\) 的最大值已经来到了 \(2e19\),这已经超出了long long甚至unsigned long long的范围,然而题目保证了 \(h\) 是偶数,而 \(1e19\) 是在unsigned long long范围内的,因此只需要把 \(h/2\) 放前面算就行了,即 \(h/2*(a+b)\) 。(也可以用int128计算结果后强转unsigned long long输出,Python虽然内置高精度,但是本题多测卡掉了)
G-代码实现
#include <bits/stdc++.h>using u64 = unsigned long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int t;std::cin >> t;while (t--) {u64 a, b, h;std::cin >> a >> b >> h;std::cout << h / 2 * (a + b) << "\n";}
}
D-解题思路
按照题意模拟即可,本题卡了ceil,需要用(a+b-1)/b进行向上取整,注意数据范围,本题需要long long
D-代码实现
#include <bits/stdc++.h>using i64 = long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int n;std::cin >> n;i64 ans;std::cin >> ans;for (int i = 1; i < n; i++) {int x;std::cin >> x;if (ans >= x) {ans = (ans + x - 1) / x;} else {ans = ans + x;}}std::cout << ans;
}
E-解题思路
按照题意模拟即可,看谁的牌先为空就输出答案。
E-代码实现
#include <bits/stdc++.h>using i64 = long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);std::string sa, sb, sc;std::cin >> sa >> sb >> sc;std::map<char, std::string> mp{{'a', sa}, {'b', sb}, {'c', sc}};char ans = 'a';while (!mp[ans].empty()) {char c = mp[ans].front();mp[ans].erase(mp[ans].begin());ans = c;}std::cout << (char)toupper(ans);
}
# Python写水题的简短代码可以学习一下
dic = {'a': list(input()), 'b':list(input()), 'c':list(input())}
c = 'a'
while dic[c]:c = dic[c].pop(0)
print(c.upper())
H-解题思路
范围相当小,纯暴力计算答案即可。
H-代码实现
#include <bits/stdc++.h>int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int n, ans = 1e9;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; i++) {std::cin >> a[i];}for (int i = -100; i <= 100; i++) {int t = 0;for (int j = 0; j < n; j++) {t += (a[j] - i) * (a[j] - i);}ans = std::min(ans, t);}std::cout << ans;
}
F-解题思路
范围相当小,纯暴力计算答案即可,注意第三个值可以用前两个值直接算出来,不要三层循环(不要将值放到容器中统计长度,这样会mle)。
F-代码实现
#include<bits/stdc++.h>using i64 = long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int k, s, cnt = 0;std::cin >> k >> s;for (int x = 0; x <= k; x++) {for (int y = 0; y <= k; y++) {if (0 <= s - x - y && s - x - y <= k) {cnt++;}}}std::cout << cnt;
}
A-解题思路
因为不会同时不喜欢1-9,所以其实最终的答案是不会大于10n的,而n的范围是1e4,所以从n开始+1遍历就行了。
A-代码实现
#include <bits/stdc++.h>int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int n, k;std::cin >> n >> k;std::set<char> st;for (int i = 0; i < k; i++) {char ch;std::cin >> ch;st.insert(ch);}int ans = n;while (1) {int f = 0;std::string s = std::to_string(ans);for (auto ch: s) {if (st.count(ch)) {f = 1;break;}}if (f) {ans++;} else {std::cout << ans;break;}}
}
# Python写水题的简短代码可以学习一下
n, k = map(int, input().split())
d = set(input().split())
ans = n
while set(str(ans)) & d:ans += 1
print(ans)
B-解题思路
范围很小可以直接dfs爆搜,将符号插在每个数字间的情况全考虑一遍即可
B-代码实现
#include <bits/stdc++.h>using i64 = long long;
i64 ans = 0;void dfs(std::string s, int pos, i64 num, i64 sum) {if(pos == s.size()) { // pos是考虑了多少个数字,如果等于size说明全考虑了ans += sum + num;return;}// num是最新的加号后面的那个数字,sum是前面所有数字运算后的和dfs(s, pos + 1, num * 10 + (s[pos] - '0'), sum); // 不插入加号dfs(s, pos + 1, s[pos] - '0', sum + num); // 插入加号
}int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);std::string s;std::cin >> s;dfs(s, 1, s[0] - '0', 0);std::cout << ans << "\n";
}