ABC 334 A ~ D 题解

ABC 334 A 题解:

思路详解:

没什么好说的,比个大小即可。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int b, g;
    cin >> b >> g;
    cout << (b > g ? "Bat\n" : "Glove\n");
    return 0;
}

ABC 334 B 题解:

思路详解:

第一步算出 > L 的能植树的最小位置

第二步算出 < R 的能植树的最大位置

我的代码和这个思路稍有不同(略微变形)

注意:

需要使用 long long 和 long double。

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int main() {
    ll a, m, l, r;
    cin >> a >> m >> l >> r;
    // a + m * x1 >= l
    // a + m * x2 <= r
    /*
    m * x1 >= l - a
    x1 >= (l - a) / m
    x2 <= (r - a) / m
    */
    long long x1 = ceil(1.0l * (l - a) / m);
    long long x2 = floor(1.0l * (r - a) / m);
    cout << x2 - x1 + 1 << "\n";
    return 0;
}

ABC 334 C 题解:

思路详解:

考虑 dp,设 dp_{i, j} 表示只考虑前 i 只袜子且是否已经丢掉了袜子了(j = 1 表示丢掉了)。

转移方程见下:

dp_{i, 0} = dp_{i - 2, 0} + a_i - a_i - 1

dp_{i, 1} = min(dp_{i - 1, 0}, dp_{i - 2, 1} + a_i - a_{i - 1})

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;
long long a[N], f[N][2];

int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= k; i++) {
        cin >> a[i];
    }
    for (int i = 2; i <= k; i++) {
        f[i][0] = f[i - 2][0] + a[i] - a[i - 1];
        f[i][1] = min(f[i - 1][0], f[i - 2][1] + a[i] - a[i - 1]);
    }
    cout << f[k][k % 2] << "\n";
    return 0;
}

ABC 334 D 题解:

思路详解:

考虑排序后做一遍前缀和,然后直接二分即可。

本题比较简单,就不多说了(感觉除 A 外最简单题)

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;
long long r[N], sum[N];

int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; i++) {
        cin >> r[i];
    }
    sort(r + 1, r + n + 1);
    for (int i = 1; i <= n; i++) {
        sum[i] = sum[i - 1] + r[i];
    }
    while (q--) {
        long long v;
        cin >> v;
        int pos = upper_bound(sum + 1, sum + n + 1, v) - sum - 1;
        cout << pos << "\n";
    }
    return 0;
}

如果大家认为哪个地方有什么不妥之处请指出,谢谢帮助!

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很高兴为您提供 Mathor Cup 2022 D 题的解题思路。 题目描述: 给定一个 $n\times n$ 的矩阵 $A$,其中 $A_{i,j}\in\{0,1\}$。你可以进行任意次以下操作: 1. 将第 $i$ 行取反(即 $A_{i,j}\rightarrow 1-A_{i,j}$); 2. 将第 $j$ 列取反(即 $A_{i,j}\rightarrow 1-A_{i,j}$)。 请你计算通过若干次操作后,能够使得矩阵 $A$ 的每一行和每一列的 $1$ 的个数相等的最小操作次数。 解题思路: 本题可以使用贪心和二分图匹配的思想来解决。具体步骤如下: 1. 统计每一行和每一列的 $1$ 的个数,设 $row_i$ 表示第 $i$ 行的 $1$ 的个数,$col_j$ 表示第 $j$ 列的 $1$ 的个数。 2. 如果每一行和每一列的 $1$ 的个数都相等,那么无需进行任何操作,直接输出 $0$。 3. 如果某一行 $i$ 的 $1$ 的个数多于其他行的 $1$ 的个数,那么可以将该行取反,将 $row_i$ 减一,将 $col_j$ 加一。 4. 如果某一列 $j$ 的 $1$ 的个数多于其他列的 $1$ 的个数,那么可以将该列取反,将 $col_j$ 减一,将 $row_i$ 加一。 5. 重复步骤 3 和步骤 4,直到每一行和每一列的 $1$ 的个数都相等。 6. 计算进行的操作次数,输出结果。 需要注意的是,为了避免重复计算,我们可以使用二分图匹配的思想来进行操作。将每一行和每一列看做二分图的两个部分,如果某一行 $i$ 的 $1$ 的个数多于其他行的 $1$ 的个数,那么可以将第 $i$ 行和所有 $1$ 的个数比该行少的列建立一条边;如果某一列 $j$ 的 $1$ 的个数多于其他列的 $1$ 的个数,那么可以将第 $j$ 列和所有 $1$ 的个数比该列少的行建立一条边。最后,将二分图的最小路径覆盖数乘以 $2$ 就是最小操作次数。 时间复杂度:$O(n^3)$。 完整代码:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值