题意:给你一个n*m的矩阵,然后把某些行和列扣掉,没被扣掉的元素中,相邻的两个元素可以造一个芯片(只能横着或竖着相邻),求对给定的矩阵和已知扣掉了哪几行哪几列,问能最多能造几个芯片。
思路:之前做过类似的题目,是一个很巧妙的数学题,但是竟然忘了,所以写一个博客记录一下。。。对每个完整的小矩阵,如果行和列不同时为奇数,那么所以的点都可以用来造芯片,相反,会剩一个点用不上。
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 200+10;
int c[maxn],r[maxn];
int main()
{
int n,m,k,cl = 0,rl = 0;
cin>>n>>m>>k;
for(int i = 0;i<k;i++)
{
int t,tem;
cin>>t>>tem;
if(t==0)
{
r[rl++] = tem;
}
else
c[cl++] = tem;
}
r[rl++] = n+1;
c[cl++] = m+1;
sort(r,r+rl);
sort(c,c+cl);
int rt = 0,sum = 0;
for(int i = 0;i<rl;i++)
{
int rc = 0;
int len = r[i]-rt-1;
if(len>0)
{
for(int j = 0;j<cl;j++)
{
int h = c[j]-rc-1;
if(h>0)
{
sum += len*h/2;
}
rc = c[j];
}
}
rt = r[i];
}
cout<<sum;
return 0;
}