CF1027C Minimum Value Rectangle 题解

这是一道数学题。

假设边长为 a , b a,b a,b,那么:

P 2 S = ( 2 a + 2 b ) 2 a b = 4 a 2 + 8 a b + 4 b 2 a b = 4 ( a b + b a ) + 8 \dfrac{P^2}{S}=\dfrac{(2a+2b)^2}{ab}=\dfrac{4a^2+8ab+4b^2}{ab}=4(\dfrac{a}{b}+\dfrac{b}{a})+8 SP2=ab(2a+2b)2=ab4a2+8ab+4b2=4(ba+ab)+8

由基本不等式,

4 ( a b + b a ) + 8 ≥ 16 4(\dfrac{a}{b}+\dfrac{b}{a})+8 \geq 16 4(ba+ab)+816

而当 a , b a,b a,b 越接近时,结果越小。

于是这道题就变成了哪两个木棍差值最小。

我们将偶数根数的木棍加入一个序列(如果有 4 根以上要多次插入),然后排序找一找即可。

代码:

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int MAXN = 1e6 + 10, MAXA = 1e4 + 10;
int t, n, book[MAXA], fir, sec, d[MAXN];
double ans;

int read()
{
	int sum = 0, fh = 1; char ch = getchar();
	while (ch < '0' || ch > '9') {if (ch == '-') fh = -1; ch = getchar();}
	while (ch >= '0' && ch <= '9') {sum = (sum << 3) + (sum << 1) + (ch ^ 48); ch = getchar();}
	return sum * fh;
}

int main()
{
	t = read();
	while (t--)
	{
		memset(book, 0, sizeof(book));
		fir = sec = 0; ans = 2147483647.0;
		n = read(); d[0] = 0;
		for (int i = 1; i <= n; ++i)
		{
			int tmp = read(); book[tmp]++;
			if (!(book[tmp] & 1)) d[++d[0]] = tmp;
		}
		sort(d + 1, d + d[0] + 1);
		for (int i = 1; i < d[0]; ++i)
		{
			double k = (double)4 * ((double)d[i] / d[i + 1] + (double)d[i + 1] / d[i]) + 8.0;
			if (k < ans)
			{
				ans = k; fir = d[i]; sec = d[i + 1];
			}
		}
		printf("%d %d %d %d\n", fir, fir, sec, sec);
	}
	return 0;
}
minimum_rotated_rectangle 是一种常用的计算几何算法,用于计算一个凸多边形的最小外接矩形。这个矩形是能够包含整个凸多边形的最小面积矩形。 在 Python 中,可以使用 OpenCV 库中的 `minAreaRect` 函数来计算一个凸多边形的最小外接矩形。这个函数接受一个包含多边形顶点坐标的 numpy 数组作为输入,返回一个矩形对象,其中包含了最小外接矩形的中心坐标、宽度、高度以及旋转角度等信息。 下面是一个示例代码,演示了如何使用 `minAreaRect` 函数计算一个凸多边形的最小外接矩形: ```python import cv2 import numpy as np # 创建一个凸多边形 points = np.array([(0, 0), (0, 100), (100, 100), (100, 50), (50, 0)]) hull = cv2.convexHull(points) # 计算凸多边形的最小外接矩形 rect = cv2.minAreaRect(hull) # 绘制凸多边形和最小外接矩形 img = np.zeros((200, 200, 3), dtype=np.uint8) cv2.drawContours(img, [hull], 0, (0, 255, 0), 2) box = cv2.boxPoints(rect).astype(np.int32) cv2.drawContours(img, [box], 0, (0, 0, 255), 2) # 显示结果 cv2.imshow('Minimum Rotated Rectangle', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例代码中,我们首先创建了一个凸多边形,然后使用 `convexHull` 函数计算了凸包,最后使用 `minAreaRect` 函数计算了凸多边形的最小外接矩形,并绘制了结果图像。可以通过修改 `points` 变量中的坐标,来测试不同形状的凸多边形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值