ABC 334 A ~ D 题解

ABC 334 A 题解:

思路详解:

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

#include 
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 
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 
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 
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;
}

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

你可能感兴趣的:(算法,贪心算法,动态规划,推荐算法)