加载中...

AtCoder题解|XXOR


AtCoder题解|ABC 117D XXOR


题目信息 📚

【题目描述】

There are $N$ gems. The value of the $i$-th gem is $V_i$.

You will choose some of these gems, possibly all or none, and get them.

However, you need to pay a cost of $C_i$ to get the $i$-th gem.

Let $X$ be the sum of the values of the gems obtained, and $Y$ be the sum of the costs paid.

Find the maximum possible value of $X - Y$.

【输入】

The input is given from Standard Input in the following format:

$N$

$V_1$ $V_2$ $\ldots$ $V_n$

$C_1$ $C_2$ $\ldots$ $C_n$

【输出】

Print the maximum possible value of $X - Y$.

【数据范围】

All values in the input are integers.

  • $1 \leq N \leq 20$
  • $1 \leq C_i, V_i \leq 50$

【输入样例1】

3
10 2 5
6 3 4

【输出样例1】

5

【输入样例2】

4
13 21 6 19
11 30 6 15		

【输出样例2】

6

【输入样例3】

1
1
50

【输出样例3】

0

【题目来源】

https://atcoder.jp/contests/abc125/tasks/abc125_b


题目解析 🍉

【题目分析】

由于数据范围较小,二进制枚举所有方案也就 $2^{20} \approx 10^6$ 级别,因此可以直接DFS暴搜。

当然,这题很容易和背包问题混淆起来,实际上并没有那么复杂:贪心,求 $X - Y$ 的最大值,只要当前物品的 $V_i > C_i$ 即可。

【C++代码】

DFS ✅

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N = 60;
int n, c[N], v[N];
int res = 0;

// DFS暴搜
// step表示当前已经选到第step个物品,is_select表示是否选择第step个物品
// vsum表示当前V总和,csum表示当前C总和
void dfs(int step, int is_select, int vsum, int csum) {
    if (step == 21) {
        res = max(res, vsum - csum);
        return;
    }
    dfs(step + 1, 0, vsum, csum);
    dfs(step + 1, 1, vsum + v[step + 1], csum + c[step + 1]);

}

int main() {
    ios::sync_with_stdio(false);  //cin读入优化
    cin.tie(0);

    // 读入数据
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> v[i];
    for (int i = 1; i <= n; i++) cin >> c[i];

    // 不选第1个物品
    dfs(1, 0, 0, 0);
    // 选择第1个物品
    dfs(1, 1, v[1], c[1]);

    cout << res << endl;

    return 0;
}

贪心 ✅

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N = 60;
int n, c[N], v[N];

int main() {
    ios::sync_with_stdio(false);  //cin读入优化
    cin.tie(0);

    // 读入数据
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> v[i];
    for (int i = 1; i <= n; i++) cin >> c[i];

    // 贪心
    LL sum = 0;
    for (int i = 1; i <= n; i++) {
        if (v[i] > c[i]) sum += (v[i] - c[i]);
    }
    cout << sum << endl;

    return 0;
}

文章作者: Rickyの水果摊
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Rickyの水果摊 !
  目录