題目大意:
有一個的蛋糕(有數字),橫着切三刀在豎着切三刀分成16份使最小的最大。
思路:
首先“最小的最大”確定了這題可以二分答案
這題我們先暴枚豎切三刀,再二分判定
:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n,m,rr,ans,l,r;
int a[1001][1001];
bool check (int i,int j,int k,int mid)//判定能不能
{
int o1 = 0, o2 = 0, o3 = 0 ,o4 = 0 ,kk = 0;
for (int sum = 1; sum <= n; ++sum)
{
o1 += a[sum][i];
o2 += a[sum][j] - a[sum][i];
o3 += a[sum][k] - a[sum][j];
o4 += a[sum][m] - a[sum][k];//求矩陣
if(o1 >= mid && o2 >= mid && o3 >= mid && o4 >= mid)
{
o1 = 0;
o2 = 0;
o3 = 0;
o4 = 0;
kk++;
}
}
return kk >= 4;
}
int main ()
{
scanf ("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
{
scanf("%1d",&a[i][j]);
rr += a[i][j];//先加上矩陣
a[i][j] += a[i][j - 1];//前綴
}
for (int i = 1; i <= m; ++i) //暴力
for (int j = i + 1; j <= m; ++j)
for (int k = j + 1; k <= m; ++k)
{
l = 0, r = rr; //左右
while(l <= r)//二分答案
{
int mid = (l + r) / 2;//中
if (check(i, j, k, mid)) l = mid + 1;
else r = mid - 1;
}
ans = max (ans,r);//答案
}
printf("%d",ans);
}