题意:如左图,给定A,B,C,D的面积分别为大于等于a,b,c,d,求最小的面积
思路:因为a,b肯定有一个是满的(不然还可压缩到更小),同理,ac,bd,cd都只有一个是满的,所以有可能是对角满的,a,d满的或者,bc满的,如下图
所以,当ad > bc是,ad满,否则bc满(长方形,分成四块,对角面积之积相等)
现在我们来考虑图一:
如题给定,则: p1 * q1 = a;
p2 * q2 = d;
条件: p2 * q1 >= c, p1 * q2 >= b; 即 : p2 / p1 > c / a, p2 / p1 < b / d;
答案为 min(p2 * q1 + p1 * q2) ,代入最上边的等式,得 ans = min(p2 / p1 * a + p1 / p2 * d);
设 t = p2 / p1;
由基本不等式,得 ans >= 2*sqrt(a * b);, 当且仅当 t = sqrt(a * b)取到。。
所以判断 t在不在条件里面,不再就判断端点就行。。
另外一种情况同样考虑即可。。。
只怪比赛时思路太搓了。。数学渣。。。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <fstream> 5 #include <algorithm> 6 #include <cmath> 7 #include <set> 8 #include <vector> 9 #include <cstdlib> 10 #define M0(a) memset(a, 0, sizeof(a)) 11 #define MXN 100010 12 #define Inf 0xfffff 13 #define eps 1e-6 14 double a, b, c, d; 15 double v; 16 double p1, p2, q1, q2; 17 18 19 void work1(){ 20 p1 = 1.0; 21 p2 = sqrt(d / a); 22 if (p2 > d/b) p2 = d /b; 23 if (p2 < c/a) p2 = c /a; 24 q1 = a / p1; 25 q2 = d / p2; 26 } 27 28 void work2(){ 29 p1 = 1.0; 30 p2 = sqrt(c/b); 31 if (p2 > c/a) p2 = c/a; 32 if (p2 < d/b) p2 = d/b; 33 q1 = c / p2; 34 q2 = b / p1; 35 } 36 37 void solve(){ 38 if (a * d >= b * c) work1(); 39 if (a * d < b * c) work2(); 40 v = (p1 + p2) * (q1 + q2); 41 printf("%.10f ", v); 42 printf("%.10f %0.10f %.10f %.10f ", p1, p2, q1, q2); 43 } 44 45 int main(){ 46 // freopen("d.in", "r", stdin); 47 // freopen("d.out", "w", stdout); 48 int cas = 0; 49 while (scanf("%lf%lf%lf%lf", &a, &b, &c, &d) != EOF){ 50 solve(); 51 } 52 fclose(stdin); fclose(stdout); 53 }