1. 程式人生 > 其它 >CF1027C Minimum Value Rectangle 題解

CF1027C Minimum Value Rectangle 題解

這是一道數學題。

假設邊長為 \(a,b\),那麼:

\[\dfrac{P^2}{S}=\dfrac{(2a+2b)^2}{ab}=\dfrac{4a^2+8ab+4b^2}{ab}=4(\dfrac{a}{b}+\dfrac{b}{a})+8 \]

由基本不等式,

\[4(\dfrac{a}{b}+\dfrac{b}{a})+8 \geq 16 \]

而當 \(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;
}