349
A - Zero Sum Game
void solve() {
int n;cin >> n;
int ans = 0;
for (int i = 0;i < n - 1;i++) {
int x;cin >> x;ans += x;
}
cout << -ans;
}
B - Commencement
由小写英文字母组成的字符串
- 在
中出现 次的字母恰好为零或恰好为两个。
给定一个字符串
void solve() {
string s;cin >> s;
map<char, int>mp;
for (int i = 0;i < s.size();i++) {
mp[s[i]]++;
}
vector<int> a(110);
for (auto [x, y] : mp) {
a[y]++;
}
bool ok = true;
for (int i = 0;i <= 100;i++) {
if (a[i] != 0 && a[i] != 2)ok = false;
}
if (ok)cout << "Yes\n";
else cout << "No\n";
}
C - Airport Code
长度为
- 从
取长度为 的子序列 (不一定连续),并将其转换为大写英文字母,形成 。 - 从
(不一定连续)中提取长度为 的子序列,将其转换为大写字母,并在末尾添加 X
,形成。
给定字符串
S 和
void solve() {
string s, t;cin >> s >> t;
for (int i = 0;i < t.size();i++) {
t[i] = tolower(t[i]);
}
int ok = 0, k = 0;
for (int i = 0;i < s.size();i++) {
if (s[i] == t[k]) {
k++;
}
}
if (k == 3 || k == 2 && t[2] == 'x') {
cout << "Yes\n";
} else {
cout << "No\n";
}
}
D - Divide Interval
对于非负整数
给你非负整数
是良好序列。
可以证明只有一种除法能使
Solution
位运算
注:
- 当
时需要特判。 - 位运算时加上
long long
以防不时之需:1ll << i
#define int long long
void solve() {
int l, r;cin >> l >> r;
vector<pair<int, int>> res;
if (!l) {
int i = 1;
for (;i <= r;) {
i *= 2;
if (i > r) {
i /= 2;break;
}
}
res.push_back({0,i});
l = i;
}
int p = l;
for (;p <= r;) {
int j = p, cnt = 1;
while (j % 2 == 0) {
cnt *= 2;j /= 2;
}
int pre = p;
p += cnt;
if (p > r) {
p -= cnt;break;
}
res.push_back({pre,p});
}
bitset<60>s1(p), s2(r);
for (int i = 59;i >= 0;i--) {
if (s1[i] != s2[i]) {
int ans = (1ll << i);
res.push_back({p,ans + p});
p += ans;
}
}
cout << res.size() << '\n';
for (auto [x, y] : res)cout << x << " " << y << "\n";
}
E - Weighted Tic-Tac-Toe
给定一个井子棋,在每个格子中含有对应的分数,两个人一人选择一个格子。
若有人先连三格,则直接赢,若平局,则分数高的分数。
Solution
博弈
(待更
判定胜负的方法
游戏的每个时点的棋盘可以用一个
我们将全白的
让我们考虑怎样计算
如果
如果
- 如果
能够经过 步操作转移到 ,且 ,则说明 可以通过这一步操作获胜 - 相反,对于
能够经过 步操作转移到的所有 ,如果 ,那么无论 怎么操作都无法获胜
根据上述性质,当我们知道了
递归函数的实现
在递归函数的实现中,当针对盘面
- 如果
是终止状态,则判断胜负并返回答案 - 如果
不是终止状态,则列举出从 经过 步操作可以到达的所有盘面 - 计算每个
对应的 - 根据计算得到的
结果,根据前述讨论判断出 的值
在处理函数
让我们来粗略地估计一下
扩展:通过记忆化递归实现
在这个问题中,即使采用朴素的递归函数也足够快速。但是,通过进行称为记忆化的优化,可以减少递归调用的次数。
在递归函数中,如果存在多种操作组合能够到达相同的盘面
通过记忆化,在对
在这个问题中,并不需要使用记忆化,但是对于盘面数目较多或者可能的转移次数较多的问题,通过记忆化优化可以大幅改善计算量。
F - Subsequence LCM
给你一个长度为
Solution
DP