-
http://ac.nbutoj.com/Problem/view.xhtml?id=1347
[1347] 老虎满坡找灰兔
- 时间限制: 1000 ms 内存限制: 65535 K
- 问题描述
-
老虎最近遇到一个很麻烦的问题, 有人叫他把一个五边形用一条直线分成两个三角形.
这个五边形如下图所示, 该五边形其实是一个矩形截去一个角. 所以有三个直角. 和两个钝角.
老虎就到处找兔子来解决这个问题. 兔子呢就拿出来一把刷子, 一条粗粗的直线. 然后两个三角形就很神奇的出来了.
兔子突然想到一个问题, 要怎么刷才能使刷过的面积最小.
现在, 我们以五边形的两条边做坐标系, 如下图所示
- 输入
-
本题有多组输入, 每组输入A和B的坐标. Ax, Ay, Bx, By 四个整数.
对于每组数据满足 0 < Ax < Bx 且 0 < By < Ay
- 输出
-
对于每组输入, 输出在五边形上刷过的最小面积. 保留2位小数.
- 样例输入
-
1 2 2 1
- 样例输出
-
2.25
- 提示
-
无
- 来源
-
monkeyde17
思路:
要是刷子刷的面积最小 即划出的2个三角形的面积为s1+s2最大
设刷子刷到x轴上的位置为(a,0)
那么着时候刷子划到y轴上的点也可以用a表示出来了
这时候就可以求出s1+s2 为一个与a有关的式子
把和与a有关的式子提取出来之后 可以发现 当这个 式子<0的时候 a越小面积越大 当式子大于0的时候 a越大越好
那么当式子小于0 则a=0最好 即刷子下边缘正好切进左下角 当式子大于0 刷子上边缘正好切进左下角 这时候a最大
用总面积减去s1 s2 就是最小的阴影面积
#include<stdio.h> int main() { double xa,ya,xb,yb; double smax,ans1,ans2; double x,y; while(scanf("%lf %lf %lf %lf",&xa,&ya,&xb,&yb)!=EOF) { smax=ya*xb-0.5*(xb-xa)*(ya-yb); // if(xa*(ya-yb)-yb*(xa-xb)<0)//a最小 //{ y=ya-(xa*yb)/xb; ans1=smax-0.5*xa*(ya-y); ans1=ans1-0.5*xb*yb; //printf(" %.2lf\n",ans); // } // else // { x=xb-((xa*yb)/ya); ans2=smax-0.5*xa*ya; ans2-=0.5*yb*(xb-x); // } printf("%.2lf\n",ans1<ans2?ans1:ans2); } return 0; }
宁波工程学院 OJ [1347] 老虎满坡找灰兔
最新推荐文章于 2016-08-20 20:20:05 发布