60pts求条
查看原帖
60pts求条
1115392
small_moon楼主2025/7/8 14:25

代码如下

#include<bits/stdc++.h>
using namespace std;
int read();
struct Node {
	int x, y;
}a[55];
struct Square {
	int xl, yl, xr, yr;
}b[20];
int n, m, ans = 1e9;
bool check(int k,int x)
{
	bool vis[505][505] = {};
	for (int i = b[k].yl; i <= b[k].yr; i++)
		for (int j = b[k].xl; j <= b[k].xr; j++)
			vis[i][j] = 1;
	for (int i = 1; i <= x; i++)
	{
		if (i == k) continue;
		for (int p = b[i].yl; p <= b[i].yr; p++)
			for (int q = b[i].xl; q <= b[i].xr; q++)
				if (vis[p][q]) return 0;
	}
	return 1;
}
int area(Square x)
{
	return abs(x.xl - x.xr) * abs(x.yl - x.yr);
}
void dfs(int k, int x, int sum)
{
	if (sum >= ans) return;
	if (x > m) return;
	if (k > n)
	{
		ans = min(ans, sum);
		return;
	}
	// ----------------
	for (int i = 1; i <= x; i++)
	{
		Square tmp = b[i];
		b[i].xl = min(b[i].xl, a[k].x); b[i].xr = max(b[i].xr, a[k].x);
		b[i].yl = max(b[i].yl, a[k].y); b[i].yr = min(b[i].yr, a[k].y);
		if (check(i, x)) dfs(k + 1, x, sum - area(tmp) + area(b[i]));
		b[i] = tmp;
	}
	// ----------------
	b[x + 1].xl = b[x + 1].xr = a[k].x;
	b[x + 1].yl = b[x + 1].yr = a[k].y;
	if (check(x + 1, x + 1)) dfs(k + 1, x + 1, sum);
	b[x + 1] = { 0,0,0,0 };
}
int main()
{
	n = read(); m = read();
	for (int i = 1; i <= n; i++)
		a[i].x = read(), a[i].y = read();
	dfs(1, 0, 0);
	printf("%d", ans);
	return 0;
}
int read()
{
	int x = 0, f = 1; char ch = getchar();
	while (ch < '0' || ch>'9')
	{
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9')
	{
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return x * f;
}
2025/7/8 14:25
加载中...