题意
有一个nnn*nnn的矩阵,矩阵上有一些巧克力,现要求一种切法(横、纵各一刀),使得四块中最小的一块上的巧克力最多。
要输出切法有多少个巧克力以及怎么切(行和列)
有多组数据!
样例
输入
8
..#..#..
.##..#..
......#.
.##.....
..#.#...
......#.
........
..#..#..
输出
3
3 4
思路
先求出前缀和,然后枚举每一种切法所得到的巧克力,取其中的最大值,并记录切法
代码
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,b[4505],f[4505][4505];
int maxx=0,x,y;
char c;
int main()
{
scanf("%d",&n);
for (int i = 1; i <= n; ++i)
{
scanf("\n");
for (int j = 1; j <= n; ++j)
{
int k = 0; scanf("%c",&c);
if (c == '#') k = 1;
b[j] = b[j] + k;
f[i][j] = f[i][j-1] + b[j]; //求前缀和
}
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
{
int t1 = f[i][j]; //求出第一块
int t2 = f[i][n] - t1; //求出第二块
int t3 = f[n][j] - t1; //求出第三块
int t4 = f[n][n] - t1 - t2 - t3; //求出第四块
if (min(min(t1,t2),min(t3,t4))>maxx)
{
maxx = min (min(t1,t2),min(t3,t4));
x = i; y = j;
} //更新最大值和切法
}
printf("%d\n%d %d",maxx,x,y);
}