小白月赛 38 题解
A 牛牛冲钻五
模拟,逐位处理判断前三位即可
#include <bits/stdc++.h>
using namespace std;
#define rep(i, j, k) for (ll(i) = (j); (i) <= (k); (++i))
typedef long long ll;
void solve() {
int n, k;
string s;
cin >> n >> k >> s;
int ans = 0, sz = s.size() - 1;
rep(i, 0, sz)
if (s[i] == 'W') {
ans++;
if (s[i - 1] == 'W' and s[i - 2] == 'W')
ans += (k - 1);
} else
ans--;
cout << ans << '\n';
}
signed main() {
int t;
cin >> t;
while (t--)
solve();
return 0;
}
B 爱吃素
仅当 a=1 且 b 为素数或 b=1 且 a 为素数时,$$ 才为素数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve() {
ll s, t;
cin >> s >> t;
if ((s != 1 and t != 1) || (s == 1 and t == 1))
cout << "NO" << '\n';
else if (s == 1 || t == 1) {
ll tmp = (t == 1 ? s : t);
for (ll i = 2; i * i <= tmp; ++i) if (tmp % i == 0)
return cout << "NO" << '\n', void();
return cout << "YES" << '\n', void();
} else
cout << "NO" << '\n';
}
signed main() {
int t;
cin >> t;
while (t--)
solve();
return 0;
}
C 糟糕的打谱员
题意
给定一个记录了 n 步有误的棋局记录表,每步包含两个整数 a,b,分别表示 棋手 a 在该步中下在了编号为 b 的劫争处。先要在 n 步有误的棋局记录表中,找出一个最长的合法行棋子序列。
一个合法行棋子序列需要满足:
- 任意相邻的两步,玩家不同(一黑一白);
- 任意相邻的两步,不能下在同一个劫争处。
Solution
如果dfs考虑每一条记录的选择,时间复杂度太高不可接受,且考虑到劫争处数量较小,dp记录劫争处当前最长的合法行棋子序列长度。
如果当前记录为黑方在编号为 b 的劫争处落子,则从上一条记录中白方不能在编号为 b 的劫争处落子;反之同理,那么就很容易写出转移方程: dp[c][b]=max(dp[c][b],dp[(c+1)%2][i]+1)i!=b&&i∈[1,10]
#include <bits/stdc++.h>
using namespace std;
#define rep(i, j, k) for (ll(i) = (j); (i) <= (k); (++i))
#define mem(x, y) memset(x, y, sizeof(x))
typedef long long ll;
int dp[2][15];
void solve() {
mem(dp, 0);
int n, x, y, res = 0;
cin >> n;
rep(i, 1, n) {
cin >> x >> y;
rep(i, 1, 10) {
if (i == y) continue;
dp[x][y] = max(dp[x][y], dp[(x + 1) % 2][i] + 1);
}
res = max(res, dp[x][y]);
}
cout << res << endl;
}
signed main() {
int t;
cin >> t;
while (t--)
solve();
return 0;
}
D Mendeleev 1417
n 个人中任意挑选 1∼n 个人,问挑选方案中奇数个人与偶数个人的方案数之差。
很显然能够看出:
挑选偶数个人的方案数为 Sumeven=∑in[i%2==0]Cni(i>0)
挑选奇数个人的方案数为 Sumodd=∑in[i%2==1]Cni(i>0)
根据二项式定理:Cneven=Cnodd
除去挑选 0 个人的情况,则可知奇数个人与偶数个人的方案数之差永远为 −1。
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n;
cin >> n;
cout << "-1\n";
}
signed main() {
int t;
cin >> t;
while (t--)
solve();
return 0;
}