<span style="color: inherit; line-height: 1.1; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; background-color: rgb(245, 245, 245);">#1245 : 王胖浩与三角形</span>
<span style="color: inherit; line-height: 1.1; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; background-color: rgb(245, 245, 245);">#1245 : 王胖浩与三角形</span>
时间限制:
1000ms
单点时限:
1000ms
内存限制:
256MB
-
1 2 3 3 3
样例输出
描述
王胖浩有一个三角形,三边长为a,b,c。他有特殊的能力,能增加三条边的边长,增加的总长度不能超过l。
他想通过合理地使用他的特殊能力,使得三角形的面积最大。
输入
第一行一个整数T,表示测试数据个数。
以下T行,每行一个四个整数a,b,c,l。
数据范围:
1<=T<=104, 1<=a,b,c<=106, 0<=l<=106
输出
输出T行,每行一个实数,表示三角形的面积。要求相对误差不能超过10-9。
5.8216152143解题思路
本题中,对于三角形的面积我们采用海伦--秦九韶公式。即对三角形三边为a,b,c。其面积S可以表示为: d=(a+b+c)/2; s=sqrt(d*(d-a)*(d-b)*(d-c)) 那么要使得面积最大,根据题目中的意思,我们可以推导出题目中的l段必须全部用(推导过程比较简单,只要比较一下总长度递增时,面积的变化情况即可)。同时,还需要考虑在对各个边进行增长时需要使得其仍是三角形。因此,可以考虑从最短的边进行加长。 编写的代码如下:
#include<iostream>
#include<math.h>
using namespace std;
void solve(double a,double b,double c ,double d);
double area_solve(double a,double b,double c);
int main(){
double T=1e4;
double a,b,c,d;
cin>>T;
for(double i=1;i<=T;i++){
cin>>a>>b>>c>>d;
if((a<=b)&&(b<=c))
solve(a,b,c,d);
else if((a<=c)&&(c<=b))
solve(a,c,b,d);
else if((b<=a)&&(a<=c))
solve(b,a,c,d);
else if((b<=c)&&(c<=a))
solve(b,c,a,d);
else if((c<=a)&&(a<=b))
solve(c,a,b,d);
else
solve(c,b,a,d);
}
return 0;
}
void solve(double a,double b,double c ,double d){
double aera2=0.0;
int flag=0;
double temp=b-a;
if(temp<=d){
a=a+temp;
d=d-temp;
}
else{
a=a+d;
aera2=area_solve((double)a,(double)b,(double)c);
flag=1;
d=0;
}
if(flag==0){
temp=c-b;
if(d>2*temp){
d=d-2*temp;
a=c;
b=c;
double k=d;
double a1=a+k/(3.0);
double b1=b+k/(3.0);
double c1=c+k/(3.0);
aera2=area_solve(a1,b1,c1);
flag=1;
}
else{
double k=d;
double a1=a+k/(2.0);
double b1=b+k/(2.0);
double c1=c;
aera2=area_solve(a1,b1,c1);
flag=1;
}
}
if(flag==1){
printf("%.11lf\n",aera2);
//cout<<setprecision(10)<<aera2<<endl;
}
}
double area_solve(double a,double b,double c){
double d=(double)(a+b+c)/(2.0);
double area=sqrt(d*(d-a)*(d-b)*(d-c));
return area;
}
题目中,需要注意的是:要求相对误差不能超过10-9 因此,暗示我们需要将其转化为double型进行处理。同时输出时,要有小数位进行输出(想吐槽一下hihocoder上对cout输出并不友好,在代码中可以看到我后来将cout那段隐掉了,换用了printf)。