网址:http://codeforces.com/contest/1194/problem/B
题意:
给出一个点阵,问至少再需要涂黑多少个点,可以出现一个长度和宽度都达到点阵最大尺寸的十字。
题解:
对于一个点阵,$n*m<4e5,n<5e4$,直接存储会MLE所以我们就计算出每一行和每一列的黑色方块数,然后枚举行和列,注意:如果交叉点是白点,会有重复计算,需要$-1$。
AC代码:
#include <bits/stdc++.h>
int x[50005],y[50005];
using namespace std;
vector<string>vec;
int main()
{
int n,a,b;
cin>>n;
while(n--)
{
vec.clear();
cin>>a>>b;
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
string str;
for(int i=0;i<a;++i)
{
cin>>str;
vec.push_back(str);
int pos=0;
for(int j=0;j<b;++j)
if(str[j]=='*')
++y[j],++pos;
x[i]=pos;
}
int minn=0x3f3f3f3f;
for(int i=0;i<a;++i)
for(int j=0;j<b;++j)
{
if(vec[i][j]=='.')
minn=min(minn,a+b-x[i]-y[j]-1);
else
minn=min(minn,a+b-x[i]-y[j]);
}
cout<<minn<<endl;
}
return 0;
}