题解:B4051 [GESP202409 五级] 小杨的武器

· · 题解

一道水题。——yuruilin2026

形式化题意

n 个元素 m 次操作,第 i 次操作能让 c 中的一个元素加上 a_i。求最后 c 中最大元素的最大值。

思路

既然题目要求最大元素的最大值,那我们可以重点培养一个元素,使它最大化。很显然,重点培养 c 中原本就是最大的元素最优。因此,只要将正数都加给最大值,把 0 和负数扔给其他元素就行了。

但是有一种特殊情况:在 c 只有一个元素的情况下,就只能全加了。

代码

注释版

#include <bits/stdc++.h>
using namespace std;
int n, m, maxn = INT_MIN;
int main(){
    scanf("%d %d", &n, &m);
    for(int i = 1, tmp; i <= n; i++){
        scanf("%d", &tmp);
        maxn = max(maxn, tmp); // 找最大值
    }
    for(int i = 1, tmp; i <= m; i++){
        scanf("%d", &tmp);
        if(n == 1) maxn += tmp; // 只有一个元素就全加
        else if(tmp > 0) maxn += tmp; // 否则只要正数
    }
    printf("%d", maxn);
}
// 感谢 yuruilin2026 的教导

无注释版

请不要复制代码。

#include <bits/stdc++.h>
using namespace std;
int n, m, maxn = INT_MIN;
int main(){
    scanf("%d %d", &n, &m);
    for(int i = 1, tmp; i <= n; i++){
        scanf("%d", &tmp);
        maxn = max(maxn, tmp);
    }
    for(int i = 1, tmp; i <= m; i++){
        scanf("%d", &tmp);
        if(n == 1) maxn += tmp;
        else if(tmp > 0) maxn += tmp;
    }
    printf("%d", maxn);
}