1201: Triangle
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 166 Solved: 18
[ Submit][ Status][ Web Board]
Description
已知三角形各边边长的取值范围,你能求出三角形最大的面积吗?
Input
输入数据的第一行包含一个整数T (1 <= T <= 200),表示接下来一共有T组测试数据。
每组数据占三行,每行均包含两个整数x, y (1 <= x <= y <= 1000),表示该边边长可以为[x, y]范围内的任意实数。
Output
用一行输出三角形的最大的面积,结果保留3位小数。如果三条边不能构成三角形,则用一行输出“No Triangle”(不包括引号)。
Sample Input
2 1 2 1 2 4 5 1 3 2 3 3 3
Sample Output
No Triangle 3.897
A. Triangle
可以证明,如果三角形的面积最大,那么至少有两条边达到最大值。假如某两条边没有达到最大值的话,我们可以通过下图的所示的方式得到一个面积更大的三角形。
于是,我们可以枚举一下究竟是哪两条边达到了最大值,这时对于第三条边的取值还是要讨论一下。不过其实第三条边也只有那么几种情况,要么取最小值,要么取最大值,要么取一个特定值使得其他两条边能够成直角。于是只要分别分析一下这三个值能否取到,并更新一下记录的最优解即可。
#include<iostream> #include<stdio.h> #include<math.h> #include<stdlib.h> #include<string.h> using namespace std; typedef struct infor{ double min; double max; }infor; infor s[4]; int main() { int t; cin>>t; while(t--){ int i,j,k; for(i=0;i<3;i++) cin>>s[i].min>>s[i].max; double max1=0,flag=0; for(i=0;i<3;i++) { for(j=0;j<3;j++) { for(k=0;k<3;k++) { if(i!=j&&j!=k&&i!=k){ double ss; if((s[i].max+s[j].max)>s[k].max&&abs(s[i].max-s[j].max)<s[k].max) { ss=(s[i].max*s[j].max*sqrt((1-((s[i].max*s[i].max+s[j].max*s[j].max-s[k].max*s[k].max)*(s[i].max*s[i].max+s[j].max*s[j].max-s[k].max*s[k].max))/(4*s[i].max*s[i].max*s[j].max*s[j].max))))/2; max1=max1<ss?ss:max1; flag=1; } if(abs(s[i].max-s[j].max)<s[k].min&&(s[i].max+s[j].max)>s[k].min) { ss=(s[i].max*s[j].max*sqrt((1-((s[i].max*s[i].max+s[j].max*s[j].max-s[k].min*s[k].min)*(s[i].max*s[i].max+s[j].max*s[j].max-s[k].min*s[k].min))/(4*s[i].max*s[i].max*s[j].max*s[j].max))))/2; max1=max1<ss?ss:max1; flag=1; } if(sqrt(s[i].max*s[i].max+s[j].max*s[j].max)>s[k].min&&sqrt(s[i].max*s[i].max+s[j].max*s[j].max)<s[k].max) { ss=(s[i].max*s[j].max)/2; max1=max1<ss?ss:max1; flag=1; } } } } } if(flag) printf("%.3lf\n",max1); else printf("No Triangle\n"); } return 0; }