牛客網 分田地

2021-08-25 14:02:19 字數 1722 閱讀 3308

每個輸入包含 1 個測試用例。每個測試用例的第一行包含兩個整數 n 和 m(1 <= n, m <= 75),表示田地的大小,接下來的 n 行,每行包含 m 個 0-9 之間的數字,表示每塊位置的價值。
輸出一行表示牛牛所能取得的最大的價值。
示例1

4 4

3332

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...