小白月赛 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=1a=1a=1​​​ 且 bbb​​​ 为素数或 b=1b=1b=1​​​ 且 aaa​​​ 为素数时,$$ 才为素数

#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 糟糕的打谱员

题意

给定一个记录了 nnn 步有误的棋局记录表,每步包含两个整数 aaabbb,分别表示 棋手 aaa 在该步中下在了编号为 bbb 的劫争处。先要在 nnn 步有误的棋局记录表中,找出一个最长的合法行棋子序列。

一个合法行棋子序列需要满足:

  1. 任意相邻的两步,玩家不同(一黑一白);
  2. 任意相邻的两步,不能下在同一个劫争处。

Solution

如果dfs考虑每一条记录的选择,时间复杂度太高不可接受,且考虑到劫争处数量较小,dp记录劫争处当前最长的合法行棋子序列长度。

如果当前记录为黑方在编号为 bbb 的劫争处落子,则从上一条记录中白方不能在编号为 bbb​ 的劫争处落子;反之同理,那么就很容易写出转移方程: dp[c][b]=max(dp[c][b],dp[(c+1)%2][i]+1)i!=b&&i[1,10]dp[c][b]=max(dp[c][b],dp[(c+1)\%2][i]+1)\quad \quad \quad i!=b \&\& i\in [1,10]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

nnn​ 个人中任意挑选 1n1\sim n1n​ 个人,问挑选方案中奇数个人与偶数个人的方案数之差。

很显然能够看出:

挑选偶数个人的方案数为 Sumeven=in[i%2==0]Cni(i>0)Sum_{even}=\sum_{i}^{n}[i\%2==0]C_n^{i} (i>0)Sumeven=in[i%2==0]Cni(i>0)

挑选奇数个人的方案数为 Sumodd=in[i%2==1]Cni(i>0)Sum_{odd}=\sum_{i}^{n}[i\%2==1]C_n^{i} (i>0)Sumodd=in[i%2==1]Cni(i>0)

根据二项式定理:Cneven=CnoddC_{n}^{even}=C_{n}^{odd}Cneven=Cnodd

除去挑选 000 个人的情况,则可知奇数个人与偶数个人的方案数之差永远为 1-11

#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;
}
全部评论

相关推荐

头像
03-18 09:09
Java
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务