zoj2607

题意:如左图,给定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 }

    

原文地址:https://www.cnblogs.com/yzcstc/p/3216228.html