CF1027C Minimum Value Rectangle 題解
阿新 • • 發佈:2022-04-08
這是一道數學題。
假設邊長為 \(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; }