“21 天好习惯”第一期-10

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 a=1 a=1​​​ 且 b b b​​​ 为素数或 b = 1 b=1 b=1​​​ 且 a a 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 n n 步有误的棋局记录表,每步包含两个整数 a a a b b b,分别表示 棋手 a a a 在该步中下在了编号为 b b b 的劫争处。先要在 n n n 步有误的棋局记录表中,找出一个最长的合法行棋子序列。

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

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

Solution

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

如果当前记录为黑方在编号为 b b b 的劫争处落子,则从上一条记录中白方不能在编号为 b b b​ 的劫争处落子;反之同理,那么就很容易写出转移方程:
$
dp[c][b]=max(dp[c][b],dp[(c+1)%2][i]+1)\quad \quad \quad i!=b && i\in [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 n n​ 个人中任意挑选 1 ∼ n 1\sim n 1n​ 个人,问挑选方案中奇数个人与偶数个人的方案数之差。

很显然能够看出:

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

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

根据二项式定理: C n e v e n = C n o d d C_{n}^{even}=C_{n}^{odd} Cneven=Cnodd

除去挑选 0 0 0 个人的情况,则可知奇数个人与偶数个人的方案数之差永远为 − 1 -1 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值