美团的笔试题,怎么拿红包金额最大

本文介绍了一种使用动态规划解决红包领取策略的问题。通过分析两种情况——拿与不拿第一个红包,来确保获得最大收益。代码示例展示了如何递归地计算每个红包的最佳选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


思路:看题目应该是想考动态规划,所以第一步是建立动态转移方程

dp(i)=max( a[i]+dp(i-2),dp(i-1))

也就是第i个位置的红包有两种方式

要么拿,拿了就不能拿i-1的红包,解是a[i]+dp(i-2)

要么不拿,不拿的解就是dp(i-1)


但是需要考虑另外一个问题,就是首尾相连

也就是拿了第一个就不能拿最后个

那么又可以分成2种方式,第一个拿与不拿

第一个拿,那么第二个和最后个就不能拿

第一个不拿,那么第二个必拿,最后个不用管拿不拿

也就是说,顺着拿一次,反着拿一次,取最大的那次就行了


import java.util.Scanner;
/*
 * 第一个位置选定,第二个位置和最后个位置不能选
 * 第一个位置不选定,则第二个位置选定,后面不用管
 * */
public class RedBag {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int N=Integer.parseInt(scanner.nextLine());
		while(N-->0){
			String nums=scanner.nextLine();
			String bags[]=nums.split(",");
			System.out.println(Math.max(getMax1(bags,bags.length-1),getMax1(reverse(bags),bags.length-1)));
		}
		scanner.close();
	}
	
	public static int getMax1(String bags[],int index){
		if (bags.length==0) {
			return 0; 
		}
		//第二个红包不拿
		if (bags.length==1 || index==0 ||bags.length==2 || index==1) {
			return Integer.parseInt(bags[0]);
		}
		if(index==bags.length-1){
			//最后个红包不拿
			return getMax1(bags, index-1);
		}
		return Math.max((Integer.parseInt(bags[index])+getMax1(bags, index-2)), getMax1(bags, index-1));
	}
	public static String[] reverse(String bags[]){
		String[] b=new String[bags.length];
		for(int i=0;i<bags.length;i++){
			b[i]=bags[bags.length-i-1];
		}
		return b;
	}
}


下面代码是我师兄写的版本

public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		for(int ii=0;ii<n;ii++){
			String s = scanner.next();
			String[] ss = s.split(",");
			int[] hb = new int[ss.length];
			for(int i=0;i<ss.length;i++){
				hb[i] = Integer.parseInt(ss[i]);
			}
			int len = hb.length;
			int[] dp1 = new int[len];
			dp1[0] = hb[0];
			dp1[1] = hb[0];
			for(int i=2;i<len-1;i++)
				dp1[i] = Math.max(dp1[i-2]+hb[i], dp1[i-1]);
			int result = dp1[len-2];
			for(int i=1;i<len;i++){
				int[] dp2 = new int[len];
				dp2[i] = hb[i];
				if(i+1<len)
					dp2[i+1]=dp2[i];
				for(int k=i+2;k<len;k++){
					dp2[k] = Math.max(dp2[k-2]+hb[k], dp2[k-1]);
				}
				result = Math.max(dp2[len-1], result);
			}
			System.out.println(result);
		}
	}



### 美团2024年笔试题库及答案 对于希望准备美团2024年技术岗位笔试的同学来说,牛客网是一个非常有价值的资源平台。该网站提供了多场美团秋招和技术岗笔试的真实题目以及详细的解答过程。 #### 编程真题实例分析 针对平均数为k的最长连续子数组问题[^2],这类动态规划类的问题通常需要理解前缀和的概念来优化暴力求解方法的时间复杂度。通过构建辅助数据结构存储中间状态,可以在O(n)时间内完成查询操作而不需要每次都重新遍历整个序列。 关于账单结算逻辑的设计[^3],这里涉及到简单的模拟算法实现。具体而言就是根据输入的数据计算各个参与者之间应该转账的具体金额,并最终汇总成一个简洁的结果列表`payResult[]`用于展示最后每个人的净收支情况。 在外卖定价策略方面[^4],此案例展示了如何处理带有条件约束的成本最小化模型。即在满足一定条件下(如达到特定消费额度),给予顾客额外折扣;同时还要考虑不同促销手段之间的相互排斥关系,确保系统能够自动选取最优支付路径以最大化节省成本。 ```python def calculate_min_cost(dishes, full_reduce_threshold, reduce_amount): original_prices = sum([dish['original'] for dish in dishes]) discounted_prices = sum([min(dish['discount'], dish['original']) for dish in dishes]) # Check if all items are at their original price to apply the reduction. can_apply_reduction = all(dish['discount'] == dish['original'] for dish in dishes) final_price = max(original_prices - (reduce_amount if can_apply_reduction and original_prices >= full_reduce_threshold else 0), discounted_prices) return final_price ``` 上述代码片段实现了对外卖订单总价基于给定参数进行计算的功能,体现了实际业务场景下的编程技巧应用。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值