生日蛋糕
题目大意
横竖两道把蛋糕分四份,自己取最少巧克力的那一份。
求最多能拿到多少巧克力。
样例输入
8
..#..#..
.##..#..
......#.
.##.....
..#.#...
......#.
........
..#..#..
样例输出
3
3 4
数据范围
20%的数据:N<=50
50%的数据:N<=2000
100%的数据:N<=4500
思路
这道题其实是一道模拟。
就枚举每一种切法,选出能获得最多巧克力的那种,并且要记录下最多可以有多少巧克力。
最后输出,就可以了。
代码
#include<cstdio>
#include<iostream>
using namespace std;
int a[4501][4501],n,maxn=-1,x,y;
char c;
int main()
{
// freopen("birth.in","r",stdin);
// freopen("birth.out","w",stdout);
scanf("%d",&n);//读入
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
cin>>c;//读入
a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1];//求前缀和
if (c=='#') a[i][j]++;//求前缀和
}
}
for (int i=1;i<=n;i++)//枚举横切法
for (int j=1;j<=n;j++)//枚举竖切法
if (min(min(a[i][j],a[n][j]-a[i][j]),min(a[i][n]-a[i][j],a[n][n]-a[n][j]-a[i][n]+a[i][j]))>=maxn)//判断这样切能拿到的是否更多
{
maxn=min(min(a[i][j],a[n][j]-a[i][j]),min(a[i][n]-a[i][j],a[n][n]-a[n][j]-a[i][n]+a[i][j]));//如果是便记录下来
x=i;y=j;//记录切法
}
printf("%d\n%d %d",maxn,x,y);//输出
// fclose(stdin);
// fclose(stdout);
return 0;
}