编程题:分田地

本文介绍了一道编程题,目标是将田地分成16份,求解最小田地的最大面积。传统暴力求解方法复杂度高,文章提出采用二分法降低复杂度,通过不断调整分割边界,确保每块田地大小大于等于目标值,最终找到最佳分割方案。

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

题目描述

牛牛和 15 个朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值。分割田地的方法是横竖各切三刀,分成 16 份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地, 作为牛牛最好的朋友,你希望牛牛取得的田地的价值和尽可能大,你知道这个值最大可以是多少吗?

输入描述:

每个输入包含 1 个测试用例。每个测试用例的第一行包含两个整数 n 和 m(1 <= n, m <= 75),表示田地的大小,接下来的 n 行,每行包含 m 个 0-9 之间的数字,表示每块位置的价值。

输出描述:

输出一行表示牛牛所能取得的最大的价值。
示例1

输入

复制
4 4
3332
3233
3332
2323

输出

复制
2

算法思路

分析题目,题目的目的其实就是把田地分为16分,怎样分使16份中最小的一块田地最大。如果单用暴力的方法来求解,要列举所有的分割方法,然后计算其中最小的田地大小,可见复杂度之大。

换个角度思考,通过二分法来求得最小的田地(最大)的情况下的大小,l=0,r=sum[n][m],其中sum[i][j]表示的是从左上方框到ij方框的田地的大小。接下来开始二分查找,先暴力列举出所有竖切的可能性,然后开始横切,每切一刀前,判断如果每一刀横切所得的四个矩形的大小大于mid,则继续在此基础上横切,否则退出该种可能,调整l和r的空间,不断缩小空间(注意既然mid是最小田地的大小,则就应该满足每一块田地的大小要大于等于mid)。

代码:

package net.stxy.one.controller;

/**
 * Created by ASU
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰太狼_cxh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值