【華為OD】MVP爭奪戰(C++、Java、Python)

文章目錄

  • 題目描述
    • 輸入描述
    • 輸出描述
    • 示例
  • 解題思路
    • 算法思路
    • 核心步驟
  • 代碼實現
    • C++實現
    • Java實現
    • Python實現
  • 算法要點
  • 復雜度分析
  • 解題總結

題目描述

在星球爭霸籃球賽對抗賽中,最大的宇宙戰隊希望每個人都能拿到MVP,MVP的條件是單場最高分得分獲得者。可以并列所以宇宙戰隊決定在比賽中盡可能讓更多隊員上場,并且讓所有得分的選手得分都相同,然而比賽過程中的每1分鐘的得分都只能由某一個人包攬。

輸入描述

  • 第一行為一個數字 t,表示為有得分的分鐘數 1 ≤ t ≤ 50
  • 第二行為 t 個數字,代表每一分鐘的得分 p,1 ≤ p ≤ 50

輸出描述

輸出有得分的隊員都是MVP時,最少得MVP得分。

示例

輸入:

9
5 2 1 5 2 1 5 2 1

輸出:

6

說明:
一共 4 人得分,分別都是 6 分:5 + 1,5 + 1,5 + 1,2 + 2 + 2

解題思路

這是一個數組劃分問題,目標是將給定的分數數組分成若干個子集,使得每個子集的和都相等,且子集數量盡可能多(MVP人數最多),這樣每個MVP的得分就最小。

算法思路

  1. 貪心策略:為了讓MVP人數最多,需要讓每個MVP的得分盡可能小
  2. 枚舉驗證:從最大可能的MVP人數開始嘗試,逐步減少直到找到可行解
  3. 回溯分組:使用回溯算法將分數分配到不同的組中,每組代表一個MVP

核心步驟

  1. 計算總分,降序排列數組
  2. 從最大MVP人數開始枚舉
  3. 對每個人數,檢查總分能否整除
  4. 使用回溯算法驗證是否能平均分組
  5. 返回第一個可行方案的單人得分

代碼實現

C++實現

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;bool canPartition(vector<int>& nums, int target, int k) {int n = nums.size();vector<int> groups(k, 0);function<bool(int)> dfs = [&](int idx) -> bool {if (idx == n) return true;for (int i = 0; i < k; i++) {if (i > 0 && groups[i] == groups[i-1]) continue;if (groups[i] + nums[idx] <= target) {groups[i] += nums[idx];if (dfs(idx + 1)) return true;groups[i] -= nums[idx];}if (groups[i] == 0) break;}return false;};return dfs(0);
}int main() {int n;cin >> n;vector<int> nums(n);for (int i = 0; i < n; i++) {cin >> nums[i];}int sum = accumulate(nums.begin(), nums.end(), 0);sort(nums.begin(), nums.end(), greater<int>());for (int target = nums[0]; target <= sum; target++) {if (sum % target == 0) {int k = sum / target;if (canPartition(nums, target, k)) {cout << target << endl;return 0;}}}return 0;
}

Java實現

import java.util.LinkedList;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt();LinkedList<Integer> link = new LinkedList<>();for (int i = 0; i < m; i++) {link.add(sc.nextInt());}System.out.println(getResult(link, m));}public static int getResult(LinkedList<Integer> link, int m) {link.sort((a, b) -> b - a);int sum = 0;for (Integer ele : link) {sum += ele;}while (m >= 1) {LinkedList<Integer> linkCopy = new LinkedList<>(link);if (canPartition(linkCopy, sum, m)) return sum / m;m--;}return sum;}public static boolean canPartition(LinkedList<Integer> link, int sum, int m) {if (sum % m != 0) return false;int target = sum / m;if (target < link.get(0)) return false;while (link.size() > 0 && link.get(0) == target) {link.removeFirst();m--;}int[] groups = new int[m];return dfs(link, 0, groups, target);}public static boolean dfs(LinkedList<Integer> link, int index, int[] groups, int target) {if (index == link.size()) return true;int select = link.get(index);for (int i = 0; i < groups.length; i++) {if (i > 0 && groups[i] == groups[i - 1]) continue;if (select + groups[i] <= target) {groups[i] += select;if (dfs(link, index + 1, groups, target)) return true;groups[i] -= select;}}return false;}
}

Python實現

def dfs(arr, groups, index, target):if index == len(arr):return Truefor i in range(len(groups)):if groups[i] + arr[index] <= target:groups[i] += arr[index]if dfs(arr, groups, index + 1, target):return Truegroups[i] -= arr[index]if groups[i] == 0:breakreturn Falsen = int(input())
arr = list(map(int, input().split()))
total_sum = sum(arr)
arr.sort(reverse=True)for target in range(arr[0], total_sum + 1):if total_sum % target == 0:group_count = total_sum // targetgroups = [0] * group_countif dfs(arr, groups, 0, target):print(target)break

算法要點

核心思想:

  • 將數組分成k個和相等的子集,使k盡可能大
  • 使用回溯算法將元素分配到不同組中
  • 從最優解開始搜索,找到第一個可行解

剪枝優化:

  1. 相同組剪枝:相同容量的組只嘗試第一個
  2. 空組剪枝:如果空組放不下,跳過后續空組
  3. 預處理:先處理等于目標值的元素
  4. 排序優化:大元素優先處理,便于剪枝

復雜度分析

  • 時間復雜度:O(k^n),k為組數,n為元素個數
  • 空間復雜度:O(k),用于存儲各組當前和

解題總結

MVP爭奪戰本質上是數組劃分問題,通過貪心策略確定搜索方向,回溯算法驗證可行性,結合多種剪枝技巧提高效率。關鍵是理解問題的數學本質:尋找最大的k值,使得數組能被分成k個和相等的子集。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90859.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90859.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Datawhale 2025 AI夏令營 MCP Server Task2

魔搭MCP &Agent賽事&#xff08;MCP Server開發&#xff09;/夏令營&#xff1a;動手開發MCP Server學習鏈接&#xff1a;魔搭MCP &Agent賽事&#xff08;MCP Server開發&#xff09; - Datawhale Task1回顧 1.task1應用功能 luner_info每日黃歷 這是一個可以獲取某天…

敏捷開發方法全景解析

核心理念:敏捷開發是以快速響應變化為核心的項目管理方法論,通過迭代式交付、自組織團隊和持續反饋,實現高質量軟件的高效交付。其本質是擁抱變化優于遵循計劃,強調"可工作的軟件高于詳盡的文檔"。 一、敏捷核心思想體系 #mermaid-svg-y7iyWsQGVWn3IpEi {font-fa…

Socket到底是什么(簡單來說)

簡單來說&#xff1a; Socket 抽象了網絡通信的復雜底層細節&#xff0c;讓應用程序開發者可以專注于發送和接收數據&#xff0c;而不用去操心數據在網絡上是如何傳輸的。 它就像一個“黑盒子”&#xff0c;你只需要把數據扔進去&#xff0c;或者從里面取數據&#xff0c;至于數…

linux系統mysql性能優化

1、系統最大打開文件描述符數查看限制 ulimit -n更改配置 # 第一步 sudo vim /etc/security/limits.conf* soft nofile 1048576 * hard nofile 1048576# 第二步 sudo vim /etc/sysctl.conffs.file-max 1048576# 第三步&#xff08;重啟系統&#xff09; sudo reboot驗證生效 u…

免費的需要嘗試claude code的API安利,截至今天可用(7月13號)

安裝方法放最后&#xff08;很簡單&#xff0c;但是你得搞定網絡&#xff09; 注冊如下&#xff1a; 鏈接如下&#xff08;有詳細說明&#xff09;&#xff1a; &#x1f680; AnyRouter&#xff5c;Claude Code 免費共享平臺 安裝&#xff08;windows用戶特殊點&#xff0…

Java 屬性配置文件讀取方法詳解

Java 屬性配置文件讀取方法詳解 一、配置文件基礎概念 1. 配置文件類型對比類型格式優點缺點適用場景Propertieskeyvalue簡單易讀&#xff0c;Java原生支持不支持層級結構簡單配置&#xff0c;JDBC參數XML標簽層級結構結構化強&#xff0c;支持復雜數據類型冗余&#xff0c;解析…

NW728NW733美光固態閃存NW745NW746

美光NW系列固態閃存深度解析&#xff1a;NW728、NW733、NW745與NW746的全方位評測技術架構與核心創新美光NW系列固態閃存&#xff08;包括NW728、NW733、NW745、NW746&#xff09;的技術根基源于其先進的G9 NAND架構。該架構通過5納米制程工藝和多層3D堆疊技術&#xff0c;在單…

【面試八股文】2025最新軟件測試面試

一、測試基礎 1、測試策略或測試包括哪些&#xff0c;測試要覆蓋哪些方面 UI、功能、性能、可靠性、易用性、兼容性、安全性、安裝卸載 2、設計測試用例的辦法 等價類、邊界值、錯誤推測法、場景法等設計方法來編寫測試用例的 &#xff08;1&#xff09;等價類分為有效等價…

AI軟件出海SEO教程

一、出海SEO核心思路 本地化&#xff1a;內容、技術、用戶體驗全面適應目標市場。關鍵詞策略&#xff1a;圍繞目標用戶的真實搜索習慣做關鍵詞挖掘和布局。內容為王&#xff1a;持續輸出高質量、解決用戶痛點的內容。技術優化&#xff1a;保證網站速度、結構、移動端體驗及安全…

PyVision:基于動態工具的具身智能體

論文地址&#xff1a; [2507.07998v1] PyVision: Agentic Vision with Dynamic Tooling 1. 背景 現有的智能體一般都是通過大模型規劃調用已經預定義好的一些工具&#xff08;具體來說也就是一些函數&#xff09;來解決問題。這樣就會導致在針對特征的任務上Agent去解決問題…

Higress 上架 KubeSphere Marketplace,助力企業構建云原生流量入口

隨著企業數字化轉型持續深化&#xff0c;云原生架構正逐漸成為構建現代應用的主流選擇。而服務治理作為云原生落地的核心能力之一&#xff0c;急需更靈活、高效的解決方案。近日&#xff0c;AI 原生的 API 網關 Higress 正式上架 KubeSphere Marketplace&#xff0c;助力用戶輕…

在LC480T上部署xapp1052

實驗環境&#xff1a;LC480T加速卡 開發環境&#xff1a;windows11vivado2020 運行環境&#xff1a;ubuntu22.04 硬件電路&#xff1a;LC480T加速卡(xc7k480tffg1156-2) vivado工程文件下載&#xff1a;https://download.csdn.net/download/xiaolangyangyang/91349686 驅動及應…

TCP的socket編程

TCP客戶端邏輯void Usage(const std::string & process) {std::cout << "Usage: " << process << " server_ip server_port" <<std::endl; } // ./tcp_client serverip serverport int main(int argc, char * argv[]) {if (ar…

【理念●體系】模板規范篇:打造可標準化復用的 AI 項目骨架

【理念●體系】從零打造 Windows WSL Docker Anaconda PyCharm 的 AI 全鏈路開發體系-CSDN博客 【理念●體系】Windows AI 開發環境搭建實錄&#xff1a;六層架構的逐步實現與路徑治理指南-CSDN博客 【理念●體系】路徑治理篇&#xff1a;打造可控、可遷移、可復現的 AI 開…

Skia---漸變色著色器

今天介紹的是實際工作中最常用到的著色器&#xff1a;漸變色著色器。 漸變色著色器是一個從一種顏色平滑的過渡到另一種顏色的效果&#xff0c;漸變色著色器的作用主要是增強圖形的視覺吸引力。 線性漸變 Skia 里的線性漸變色著色器是最簡單的漸變色著色器&#xff0c;它用于…

2025.07.09華為機考真題解析-第二題200分

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍OJ 02. 地鐵線路故障預警系統 問題描述 LYA 負責管理一個城市的地鐵網絡系統。地鐵網絡由 n n n

數學建模:非線性規劃:凸規劃問題

一、定義凸集定義??&#xff1a;設Ω是n維歐氏空間的一點集&#xff0c;若任意兩點x?∈Ω&#xff0c;x?∈Ω&#xff0c;其連線上的所有點αx?(1-α)x?∈Ω&#xff0c;(0≤α≤1)&#xff0c;則稱Ω為凸集。??凸函數定義??&#xff1a;給定函數f(x)(x∈D?R?)&…

ISIS | 廣播網絡中的 ISIS 偽節點 LSP

注&#xff1a;本文為 “ISIS | 偽節點 LSP” 相關合輯。 英文引文&#xff0c;機翻未校。 中文引文&#xff0c;略作重排。 如有內容異常&#xff0c;請看原文。 ISIS in Broadcast Network and Pseudonode LSP 廣播網絡中 的 ISIS 偽節點 LSP ISIS in broadcast network is…

ARIA UWB安全雷達主要產品型號與核心功能全解析

ARIA UWB雷達擁有LT系列與AHM系列兩大產品線。LT103 XBT、LT102 V2、LT103 OEM等代表型號具備高精度定位、低功耗和強穿透能力&#xff0c;適用于工業自動化與物聯網。AHM3D、AHM2D、AHM3DSC則專注三維檢測和智能計算&#xff0c;廣泛服務于醫療健康、安防監控等場景。Hydrogen…

NLP自然語言處理04 transformer架構模擬實現

總體架構輸入部分代碼實現:導包# -*-coding:utf-8-*- import matplotlib.pyplot as plt import numpy as np import torch import torch.nn as nn # -*-coding:utf-8-*- import copy import torch.nn.functional as F import math位置編碼器部分詞嵌入WordEmbedding# todo 作用…