小美的蛋糕切割(美团2024届秋招笔试第一场编程真题)

题目分析:切蛋糕问题切记可以横着切,也可以竖着切。本题目需要快速求得两个矩形的和,可以用二维前缀和数组解决。然后枚举一刀切的位置。

#include <iostream>
#include <algorithm>
using namespace std;
int a[1005][1005];
long long sum[1005][1005];/**< 注意到数据范围可能超过int */
int main()
{
    int i,j,n,m;
    cin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            cin>>a[i][j];/**< 二维前缀和数组常见求法 */
            sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
        }
    long long ans=sum[n][m];
    /**< 枚举蛋糕切割,注意可以横着也可以竖着切 */
    for(i=1;i<n;i++)
        ans=min(ans,abs(sum[i][m]-(sum[n][m]-sum[i][m])));/**<sum[i][m]上半块蛋糕  */
    for(j=1;j<m;j++)
        ans=min(ans,abs(sum[n][j]-(sum[n][m]-sum[n][j])));/**<sum[n][j]左半块蛋糕  */
    cout<<ans;
    return 0;
}

解释下:sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];作用

### 关于美团面试题中小美相关的技术问题 #### 小美的外卖订单 在美团的面试题中,涉及到了小美的外卖订单的设计与测试用例。此问题的核心在于如何合理地应用等价类划方法来设计测试场景[^2]。 具体来说,需要考虑以下几个方面: 1. **输入验证** 测试用例应覆盖各种边界条件以及非法输入的情况。例如,菜的数量 \( n \) 是否为正整数;每道菜的原价 \( a \) 和折扣价 \( b \),需满足 \( b \leq a \) 的约束条件。 2. **逻辑支测试** 对于满减规则的应用情况,需要别测试以下几种情形: - 购买菜品总价未达到满减门槛 \( x \); - 总价刚好等于满减门槛 \( x \); - 总价超过满减门槛 \( x \),但不足以完全抵扣减免金额 \( y \); - 总价远超满减门槛 \( x \),能够充使用减免金额 \( y \)。 3. **互斥规则检验** 满减优惠和折扣价不可同时享受这一特性也需要被纳入测试范围。即只有当所有菜品均按原价计费时才可启用满减策略。 以下是基于上述析的一个简单代码框架用于模拟计算最低支付金额: ```python def calculate_min_price(n, dishes, full_reduce): original_total = sum(dish[0] for dish in dishes) discount_total = sum(min(dish[0], dish[1]) for dish in dishes) # 如果全选原价且符合条件则可用满减 if original_total >= full_reduce[0]: reduced_total = max(original_total - full_reduce[1], 0) return min(discount_total, reduced_total) else: return discount_total ``` --- #### 小美的密码尝试次数 另一个关于小美的问题是其忘记密码后的尝试过程[^3]。这实际上是一个排列组合优化问题,目标是最少和最多尝试次数下的成功概率布。 解决这个问题的关键点包括: - 密码列表按照长度升序排序后逐一试探; - 若存在多个同长字符串,则随机选取其中一个进行匹配操作直到找到正确答案为止。 下面给出一段伪代码展示整个流程: ```python from collections import defaultdict def password_attempts(passwords, target_password): length_map = defaultdict(list) # 根据长度组存储密码 for pwd in passwords: length_map[len(pwd)].append(pwd) sorted_lengths = sorted(length_map.keys()) attempts = 0 found = False for l in sorted_lengths: group = length_map[l] random.shuffle(group) # 假设这里实现了真正的随机打乱 for candidate in group: attempts += 1 if candidate == target_password: found = True break if found: break return (attempts, len(passwords)) # 返回最小尝试次数和最大可能尝试次数 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值