首页 > 试题广场 >

灵异背包?

[编程题]灵异背包?
  • 热度指数:3516 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}给定 n 个正整数 \{a_1,a_2,\dots,a_n\},你可以任选若干个放入“灵异背包”。

\hspace{15pt}要求背包内所有数之和为偶数,且在满足偶数的前提下尽可能大。若一个数也不选,则背包和为 0

\hspace{15pt}请输出可以获得的最大偶数和。

输入描述:
\hspace{15pt}第一行输入一个整数 n\left(1\leqq n\leqq 10^5\right)
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots,a_n\left(1\leqq a_i\leqq 2\times10^4\right)


输出描述:
\hspace{15pt}输出一个整数,表示满足条件的最大偶数和。
示例1

输入

3
2 5 6

输出

8

说明

当灵异背包里面有(2,5,6),此时总和为2+5+6=13,为奇数,不满足条件。
当灵异背包里面有(2,6),此时总和为2+6=8,为偶数,且为最大值。
示例2

输入

1
3

输出

0

说明

选择的灵异背包为空,总和为0。
偶数 + 偶数 = 偶数
奇数 + 奇数 = 偶数
奇数 + 偶数 = 奇数
先把所有偶数加起来,把所有奇数放到一个数组中,从大到小排序,继续累加最大偶数个奇数。
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    while(line = await readline()){
        const n = Number(line);
        const nums = (await readline()).split(' ').map(Number);
        let sum = 0;
        let odds = [];
        for (let i = 0; i < n; i++) {
            if (nums[i] % 2 === 0) {
                sum += nums[i];
            } else {
                odds.push(nums[i]);
            }
        }

        if (odds.length > 1) {
            odds.sort((a, b) => b - a);
            const len = odds.length % 2 === 0 ? odds.length : odds.length-1;
            for (let i = 0; i < len; i++) {
                sum += odds[i];
            }
        }

        console.log(sum);
    }
}()




发表于 2025-09-27 15:53:48 回复(0)