news 2026/5/20 22:02:38

(新卷,100分)- 最大花费金额(Java JS Python C)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(新卷,100分)- 最大花费金额(Java JS Python C)

(新卷,100分)- 最大花费金额(Java & JS & Python & C)

题目描述

双十一众多商品进行打折销售,小明想购买自己心仪的一些物品,但由于受购买资金限制,所以他决定从众多心仪商品中购买三件,而且想尽可能的花完资金。

现在请你设计一个程序帮助小明计算尽可能花费的最大资金数额。

输入描述
  • 输入第一行为一维整型数组M,数组长度小于100,数组元素记录单个商品的价格,单个商品价格小于1000。
  • 输入第二行为购买资金的额度R,R小于100000。
  • 输入格式是正确的,无需考虑格式错误的情况。
输出描述
  • 输出为满足上述条件的最大花费额度。
  • 如果不存在满足上述条件的商品,请返回-1。
用例
输入

23,26,36,27


78

输出76
说明金额23、26和27相加得到76,而且最接近且小于输入金额78。
输入23,30,40
26
输出-1
说明因为输入的商品,无法组合出来满足三件之和小于26.故返回-1。
题目解析

本题其实就是让我们从n个数中选择3个,保证这个3个数之和最接近且小于等于某个target。

解题思路是:

首先,我们将n个数的数组进行升序。

然后用三个指针I,L,R去指向数组的三个元素,形成三数组合,其中:

  • I指针就是按照for循环遍历的顺序进行移动,从0~n-1
  • L指针初始为 I + 1 位置
  • R指针初始为 n - 1 位置

如下图所示:

其中 I 指针在每一轮循环中是位置固定的,我们需要移动L,R来找不大于,且最接近target的组合。L,R指针的移动逻辑如下:

假设 sum = arr[I] + arr[L] + arr[R]

  • 如果sum == target了,则说明当前三个指针指向的元素组合就是不大于,且最接近target的答案,可以直接返回。
  • 如果 sum < target,则说明三指针指向元素组合之和是一个可能解,但是不一定是最优解,此时我们应该先记录这个可能解,然后尝试将L++,由于arr已经升序了,因此L++后,新的三数组合之和一定比现在的大。
  • 如果 sum > target,则说明三指针指向元素组合之和过大了,此时应该R--,这样新的三数组合之和一定比现在的小。

按此逻辑,将当前 I 指针固定的数的三数组合情况全部求出。

之后,再 I ++ ,尝试其他三数组合。

JavaScript算法源码
/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines = []; rl.on("line", (line) => { lines.push(line); if (lines.length === 2) { const arrM = lines[0].split(",").map(Number); const r = lines[1] - 0; console.log(getResult(arrM, r)); lines.length = 0; } }); function getResult(arr, target) { // 题目说小明要购买三件,如果商品不足三件直接返回-1 if (arr.length < 3) return -1; // 数组升序 arr.sort((a, b) => a - b); let ans = -1; for (let i = 0; i < arr.length; i++) { let l = i + 1; let r = arr.length - 1; while (l < r) { const sum = arr[i] + arr[l] + arr[r]; if (sum == target) { return sum; } else if (sum < target) { ans = Math.max(ans, sum); l++; } else { r--; } } } return ans; }
Java算法源码
import java.util.Arrays; import java.util.Scanner; public class Main { // 输入获取 public static void main(String[] args) { Scanner sc = new Scanner(System.in); Integer[] arrM = Arrays.stream(sc.nextLine().split(",")).map(Integer::parseInt).toArray(Integer[]::new); int r = Integer.parseInt(sc.nextLine()); System.out.println(getResult(arrM, r)); } // 算法入口 public static int getResult(Integer[] arr, int target) { // 题目说小明要购买三件,如果商品不足三件直接返回-1 if (arr.length < 3) return -1; // 数组升序 Arrays.sort(arr); int ans = -1; for (int i = 0; i < arr.length; i++) { int l = i + 1; int r = arr.length - 1; while (l < r) { int sum = arr[i] + arr[l] + arr[r]; if (sum == target) { return sum; } else if (sum < target) { ans = Math.max(ans, sum); l++; } else { r--; } } } return ans; } }
Python算法源码
# 输入获取 arr = list(map(int, input().split(","))) target = int(input()) # 算法入口 def getResult(): # 题目说小明要购买三件,如果商品不足三件直接返回-1 if len(arr) < 3: return -1 # 数组升序 arr.sort() ans = -1 for i in range(len(arr)): l = i + 1 r = len(arr) - 1 while l < r: total = arr[i] + arr[l] + arr[r] if total == target: return total elif total < target: ans = max(ans, total) l += 1 else: r -= 1 return ans # 算法调用 print(getResult())
C算法源码
#include <stdio.h> #include <stdlib.h> #define MAX(a,b) (a) > (b) ? (a) : (b) #define MAX_SIZE 100 int cmp(const void *a, const void *b); int getResult(int nums[], int nums_size, int target); int main() { int nums[MAX_SIZE]; int nums_size = 0; while (scanf("%d", &nums[nums_size++])) { if (getchar() != ',') break; } int target; scanf("%d", &target); printf("%d\n", getResult(nums, nums_size, target)); return 0; } int getResult(int nums[], int nums_size, int target) { // 题目说小明要购买三件,如果商品不足三件直接返回-1 if (nums_size < 3) return -1; // 数组升序 qsort(nums, nums_size, sizeof(int), cmp); int ans = -1; for(int i=0; i<nums_size; i++) { int l = i + 1; int r = nums_size - 1; while(l < r) { int sum = nums[i] + nums[l] + nums[r]; if(sum == target) { return sum; } else if(sum < target) { ans = MAX(ans, sum); l++; } else { r--; } } } return ans; } int cmp(const void *a, const void *b) { return (*(int *) a) - (*(int *) b); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 4:38:06

用贪心算法解决仅含 6 和 9 数字的最大翻转值问题

一&#xff0c;创作灵感作为一名在校大学生&#xff0c;平时的算法学习中总觉得抽象的算法概念很难落地&#xff0c;直到遇到这个仅由 6 和 9 组成的数字翻转问题。起初我还在纠结要不要枚举所有翻转情况再找最大值&#xff0c;但转念一想&#xff0c;枚举的方式不仅麻烦&#…

作者头像 李华
网站建设 2026/5/20 18:13:45

git commit规范在vLLM项目开发中的最佳实践

vLLM 高性能推理开发中的 git commit 规范实践 在当前大模型应用爆发式增长的背景下&#xff0c;如何高效、稳定地部署 LLM 服务已成为工程团队的核心挑战。像 LLaMA、Qwen、ChatGLM 这类百亿级参数模型一旦投入生产环境&#xff0c;对吞吐量和显存利用率的要求极为严苛。传统推…

作者头像 李华
网站建设 2026/5/19 1:15:15

RAG面试通关秘籍:28个高频问题深度解析,建议收藏!

这篇文章系统梳理了RAG技术的28个高频面试问题&#xff0c;涵盖基础认知、常见问题、高级机制、RAG-Fusion、优化策略及未来展望。内容涉及RAG原理、与SFT的区别、内容缺失等问题的解决方案&#xff0c;以及RAG-Fusion工作机制和优化策略。文章还探讨了RAG的多模态、Agent自主检…

作者头像 李华
网站建设 2026/5/20 18:16:18

3分钟零代码:用Formily可视化设计器构建专业表单

还在为复杂表单开发而头疼吗&#xff1f;面对各种表单验证、布局调整和组件配置&#xff0c;传统的编码方式往往需要花费数小时甚至更长时间。现在&#xff0c;通过Formily可视化表单设计器&#xff0c;你可以在3分钟内完成专业级表单的搭建&#xff0c;完全无需编写任何代码。…

作者头像 李华
网站建设 2026/5/20 15:24:23

抖音无水印下载终极方案:3分钟搞定高清视频与创作者资料

抖音无水印下载终极方案&#xff1a;3分钟搞定高清视频与创作者资料 【免费下载链接】DouYinBot 抖音无水印下载 项目地址: https://gitcode.com/gh_mirrors/do/DouYinBot 还在为抖音视频的水印烦恼吗&#xff1f;DouYinBot 作为一款专业的抖音解析工具&#xff0c;能够…

作者头像 李华
网站建设 2026/5/21 2:07:53

低成本运行210亿参数模型?GPT-OSS-20B在16GB内存设备上的实践

低成本运行210亿参数模型&#xff1f;GPT-OSS-20B在16GB内存设备上的实践 你有没有想过&#xff0c;在一台普通的笔记本电脑上&#xff0c;也能跑一个拥有210亿参数的大语言模型&#xff1f;不是云端API调用&#xff0c;也不是远程服务器访问——而是真正在你的MacBook Air、老…

作者头像 李华