题目链接:

https://codeforces.com/problemset/problem/1269/D

题目大意:

给定非递增序列构成的杨氏图,问最多能放下多少个 1 * 2 或 2 * 1 的不重叠的矩形。

思路:

采用染色法,将一个矩形分解为一个 黑色格子 + 一个 白色格子。整个杨氏图都涂成 不相邻 的黑白格子,第一列最底下第一个单元格 染成黑色。
单独考虑某一列,放入若干个 2 * 1 的矩形之后,若其高度为偶数,则没有多余的格子,若为奇数,则多一个格子,若是奇数列,则多一个黑色的格子,反之则多一个白色的格子。
当某列多出一个黑色,另一列多出一个白色,就可以新组成一个矩形,而每列多出一个格子后,只能向右边有多格子的列“借”一个格子,这就解释了为什么需要一个非递增的序列,如果不是非递增,某两列不相邻的格子数都多1,且这两列的格子数远大于周围格子的数量,那么中间低两边高的分布就阻止了左边高的那列向右边高的那列“借”格子的操作。
所以答案就是黑色格子的数量何白色格子的数量中小的那一个。

代码:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
void solve(){
	LL n, x = 0, y = 0, a;  //x表示白色格子的数量,y表示黑色格子的数量
	cin >> n;
	for (int i = 1; i <= n; i++){
		scanf("%lld", &a);
		x += (a / 2);
		y += (a / 2);
		if (i % 2 == 0) x += a % 2;
		else y += a % 2;
	}
	cout << min(x, y) << "\n";
}
int main(){
	solve();
	return 0;
}
posted on 2022-01-04 19:45  Hamine  阅读(25)  评论(0编辑  收藏  举报