CF330A Cakeminator 题解

Content

有一个 \(r\)\(c\) 列的矩形蛋糕,由 \(r\times c\)\(1\times 1\) 的蛋糕组成,其中有几块蛋糕上有一些草莓。你不喜欢吃草莓,又想吃得很爽,于是你决定每次吃不含任何草莓的一行或一列(前提是至少能吃到一块 \(1\times 1\) 的蛋糕)。求你最多能够吃多少块蛋糕。

数据范围:\(2\leqslant r,c\leqslant 10\)

Solution

我们不妨从每个草莓的行和列入手,那么这个草莓所在的行和列都要被排除掉。剩下的没被排除掉的就是我们可以吃的那部分蛋糕。

设总共有 \(a\) 排、\(b\) 列可以能够吃蛋糕,那么通过容斥原理,我们可以发现多算了 \(ab\) 块蛋糕,所以要减去。那么答案就是 \(ac+br-ab\)

Code

#include <cstdio>
using namespace std;

int n, m, row[17], line[17], ansr, ansl;
char s[17][17];

int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; ++i)	row[i] = 1;
	for(int j = 1; j <= m; ++j)	line[j] = 1;
	for(int i = 1; i <= n; ++i)	{
		scanf("%s", s[i] + 1);
		for(int j = 1; j <= m; ++j)
			if(s[i][j] == 'S')	row[i] = line[j] = 0;
	}
	for(int i = 1; i <= n; ++i)	ansr += row[i];
	for(int j = 1; j <= m; ++j)	ansl += line[j];
	printf("%d", ansr * m + ansl * n - ansr * ansl);
}
posted @ 2021-12-21 20:30  Eason_AC  阅读(36)  评论(0)    收藏  举报