返回介绍

lcp / LCP 40. 心算挑战 / README

发布于 2024-06-17 01:04:41 字数 3859 浏览 0 评论 0 收藏 0

LCP 40. 心算挑战

题目描述

「力扣挑战赛」心算项目的挑战比赛中,要求选手从 N 张卡牌中选出 cnt 张卡牌,若这 cnt 张卡牌数字总和为偶数,则选手成绩「有效」且得分为 cnt 张卡牌数字总和。 给定数组 cardscnt,其中 cards[i] 表示第 i 张卡牌上的数字。 请帮参赛选手计算最大的有效得分。若不存在获取有效得分的卡牌方案,则返回 0。

示例 1:

输入:cards = [1,2,8,9], cnt = 3

输出:18

解释:选择数字为 1、8、9 的这三张卡牌,此时可获得最大的有效得分 1+8+9=18。

示例 2:

输入:cards = [3,3,1], cnt = 1

输出:0

解释:不存在获取有效得分的卡牌方案。

提示:

  • 1 <= cnt <= cards.length <= 10^5
  • 1 <= cards[i] <= 1000

解法

方法一:排序 + 贪心

排序先取最大的 $cnt$ 个数,如果和为偶数则直接返回答案。

否则,找一个已取的最小奇数换成剩余未取的最大偶数,或者找一个已取的最小偶数换成剩下未取的最大奇数,取两者中较大的。

时间复杂度 $O(nlogn)$。

class Solution:
  def maxmiumScore(self, cards: List[int], cnt: int) -> int:
    cards.sort(reverse=True)
    t = cards[:cnt]
    ans = sum(t)
    if ans % 2 == 0:
      return ans
    a = min([v for v in t if v & 1], default=inf)
    b = min([v for v in t if v % 2 == 0], default=inf)
    c = max([v for v in cards[cnt:] if v % 2 == 0], default=-inf)
    d = max([v for v in cards[cnt:] if v & 1], default=-inf)
    return max(ans - a + c, ans - b + d, 0)
class Solution {
  public int maxmiumScore(int[] cards, int cnt) {
    Arrays.sort(cards);
    int ans = 0;
    int n = cards.length;
    for (int i = 0; i < cnt; ++i) {
      ans += cards[n - i - 1];
    }
    if (ans % 2 == 0) {
      return ans;
    }
    int inf = 0x3f3f3f3f;
    int a = inf, b = inf;
    for (int i = 0; i < cnt; ++i) {
      int v = cards[n - i - 1];
      if (v % 2 == 1) {
        a = Math.min(a, v);
      } else {
        b = Math.min(b, v);
      }
    }
    int c = -inf, d = -inf;
    for (int i = cnt; i < n; ++i) {
      int v = cards[n - i - 1];
      if (v % 2 == 0) {
        c = Math.max(c, v);
      } else {
        d = Math.max(d, v);
      }
    }
    return Math.max(0, Math.max(ans - a + c, ans - b + d));
  }
}
class Solution {
public:
  int maxmiumScore(vector<int>& cards, int cnt) {
    sort(cards.begin(), cards.end());
    reverse(cards.begin(), cards.end());
    int ans = 0, n = cards.size();
    for (int i = 0; i < cnt; ++i) ans += cards[i];
    if (ans % 2 == 0) return ans;
    int inf = 0x3f3f3f3f;
    int a = inf, b = inf, c = -inf, d = -inf;
    for (int i = 0; i < cnt; ++i) {
      int v = cards[i];
      if (v % 2 == 1)
        a = min(a, v);
      else
        b = min(b, v);
    }
    for (int i = cnt; i < n; ++i) {
      int v = cards[i];
      if (v % 2 == 0)
        c = max(c, v);
      else
        d = max(d, v);
    }
    return max(0, max(ans - a + c, ans - b + d));
  }
};
func maxmiumScore(cards []int, cnt int) int {
  ans := 0
  sort.Slice(cards, func(i, j int) bool { return cards[i] > cards[j] })
  for _, v := range cards[:cnt] {
    ans += v
  }
  if ans%2 == 0 {
    return ans
  }
  inf := 0x3f3f3f3f
  a, b, c, d := inf, inf, -inf, -inf
  for _, v := range cards[:cnt] {
    if v%2 == 1 {
      a = min(a, v)
    } else {
      b = min(b, v)
    }
  }
  for _, v := range cards[cnt:] {
    if v%2 == 0 {
      c = max(c, v)
    } else {
      d = max(d, v)
    }
  }
  return max(0, max(ans-a+c, ans-b+d))
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文