大体题意:
给你一个第一象限的一个角,在给你n个正方形的边长,问这个角和正方形围成面积的最大值!
样例就给了一个一个正方形,完全不好找规律,但求出样例后发现,发现正方形和y轴,x轴是平行的。
就可以猜测,n个正方形的摆放也一定是与y轴,x轴平行的,剩下的就是正方形之间如何摆放了,很显然是他们对角线共线的时候,,(其实看了学长的博客知道的)
然后就是求可以了,
求解有多种办法,在这里给出两个:
①:先求三角形ABH面积加上OAH的面积,其中三角形ABH可拆成ATB+BTH,其中tan∠TBH = k1,这样这个三角形可以解决。
在一个就是三角形AOH了,可过A做x轴的垂线,其中tan∠BOX = k1,tan∠AOX = k2,这样也可联立方程求解!
最后相加即可!
②:可联立方程求出A,B的坐标,最后根据叉乘求解!
这个题有个坑,K2不一定大于K1,注意交换一下就行了(错了好多次!)
代码①:
#include<cstdio> #include<algorithm> using namespace std; const double eps = 1e-8; int main() { int N; while(scanf("%d",&N) == 1 && N){ double x,y; scanf("%lf%lf",&x,&y);double k2 = y/x; scanf("%lf%lf",&x,&y);double k1 = y/x; if (k2 < k1)swap(k2,k1); double sum=0,k,sums=0,s=0; for (int i = 0; i < N; ++i){ scanf("%lf",&k); sum+=k; s+=k*k/2.0; } sums+=sum*(1.0+k1)*sum/2.0-s; x=(1.0+k1)*sum/(k2-k1); sums+=(x*(k1*x+k1*sum+sum)-x*k1*x)/2.0; printf("%.3lf\n",sums+eps); } return 0; }