E 挡光线 题解

来源:互联网 发布:linux查看磁盘使用情况 编辑:程序博客网 时间:2024/04/29 10:07

这里写图片描述
这里写图片描述
这里写图片描述
这其实就是一道简单的几何题。
正方形是一种特殊的几何图形,连接图中所有的正方形对角线,就会得到以下图形:
这里写图片描述
题目中说到,正方形的位置可以任意摆放,显然,这个图中的正方形还可以继续向两条直线的方向移动,增大黄色区域的面积。想象一下,这个时候,两个正方形对角线之间的距离就在慢慢缩小,直到下面这种情况:

这就是正方形的对角线在一条直线上的情况。
这时,如果正方形继续向上移动,光线就挡不住了,不符合题意。因此,当所有的正方形对角线都在一条直线上时,挡住光线的面积最大。
现在,问题就很好办了。
只需要运用一次函数中的数学知识,将各个点的坐标算出来即可。
总结
1.变量要初始化;
2.最好使用double类型变量,尽量不用float,因为double有效位是16位,float是8位,误差小,否则很容易出毛病;
3.输出注意双精度浮点数的输出格式:%lf,单精度浮点数输出格式:%f。

附上丑代码:

#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>#include<iostream>using namespace std;int main(){    /*不要被这么多变量吓住了,自己照着题目再推一遍之后就会觉得很简单了*/    int n;    double xa,xb,ya,yb,x1,k1,k2,tk,b,len=0,S=0,S_=0,sqr[12];    cin>>n;    cin>>xa>>ya>>xb>>yb;    for(int i=1;i<=n;i++){cin>>sqr[i];len+=sqr[i];S_+=sqr[i]*sqr[i];}    k1=ya/xa,k2=yb/xb;    if(k1<k2){tk=k1;k1=k2;k2=tk;}    x1=((k2+1)*len)/(k1-k2);    b=(k1+1)*x1;    S=(b*len-S_)/2.0;    printf("%.3lf",S);    return 0;}
原创粉丝点击