每個輸入包含 1 個測試用例。每個測試用例的第一行包含兩個整數 n 和 m(1 <= n, m <= 75),表示田地的大小,接下來的 n 行,每行包含 m 個 0-9 之間的數字,表示每塊位置的價值。
輸出一行表示牛牛所能取得的最大的價值。示例1
4 43332
3233
3332
2323
2
n, m = [int(each) for each in input().split()]
mat = [[int(each) for each in input().strip()] for i in range(n)]
left = min([min(each) for each in mat])
right = sum([sum(m) for m in mat]) // 16 + 1
sums = [[0 for j in range(m + 1)] for i in range(n + 1)]
for i in range(1, n + 1):
for j in range(1, m + 1):
sums[i][j] = sums[i - 1][j] + sums[i][j - 1] - sums[i - 1][j - 1] + mat[i - 1][j - 1]
def sum_grid(x0, y0, x1, y1):
return sums[x1][y1] - sums[x0][y1] - sums[x1][y0] + sums[x0][y0]
def judge(mat, n, m, val):
for r1 in range(1, n - 2):
if sum_grid(0, 0, r1, m) < 4 * val: continue
for r2 in range(r1 + 1, n - 1):
if sum_grid(r1, 0, r2, m) < 4 * val: continue
for r3 in range(r2 + 1, n):
if sum_grid(r2, 0, r3, m) < 4 * val: continue
if sum_grid(r3, 0, n, m) < 4 * val: continue
start, count = 0, 0
for i in range(m + 1):
if sum_grid(0, start, r1, i) >= val \
and sum_grid(r1, start, r2, i) >= val \
and sum_grid(r2, start,r3,i) >= val \
and sum_grid(r3, start, n, i) >= val:
start, count = i, count + 1
if count == 4:
return true
return false
while left < right:
mid = (left + right) // 2
state = judge(mat, n, m, mid)
if state:
left = mid + 1
else:
right = mid
print(right - 1)
分田地
網易2017內推筆試1:分田地 [python]
牛客網2017校招真題 分田地
題目描述 解題思路 if content count 4 表明當前x是16塊田地中最小的,返回true return false int main int ans 0 int left 0,right sums n m sum n m 表示所有價值總和 while left right 二分答案,判...
牛客網 分蘋果
n 只奶牛坐在一排,每個奶牛擁有 a i 個蘋果,現在你要在它們之間轉移蘋果,使得最後所有奶牛擁有的蘋果數都相同,每一次,你只能從乙隻奶牛身上拿走恰好兩個蘋果到另乙個奶牛上,問最少需要移動多少次可以平分蘋果,如果方案不存在輸出 1。每個輸入包含乙個測試用例。每個測試用例的第一行包含乙個整數 n 1 ...
分元宵(牛客網)
五個資料abcde就是求 a b c d e 我卡98 的樣例了,因為我一開始取模時候把四個資料都取模了,但是這樣可能會把次方數模出問題,比如模成0或者什麼什麼的。反正只模底就好了。include using namespace std typedef long long ll const doub...