为什么这个思路不对))
查看原帖
为什么这个思路不对))
956316
77Glorious楼主2024/5/4 20:02

原本想枚举p,直接用原本边长*p算出对应边长然后用面积公式,发现怎么都不对))

#include<bits/stdc++.h>
using namespace std;

double area(double x,double y,double z)//计算三角形的面积 
{
	double p=(x+y+z)/2;
	return sqrt(p*(p-x)*(p-y)*(p-z)); 
}
int main()
{
	double l,r,x1,y1,x2,y2,x3,y3;
	double minn=1e9;
	cin>>l>>r>>x1>>y1>>x2>>y2>>x3>>y3;
	double ab=sqrt(pow((x1-x2),2)+pow((y1-y2),2)),
	ac=sqrt( pow((x2-x3),2) + pow((y2-y3),2) ),
	bc=sqrt(pow((x1-x3),2)+pow((y1-y3),2));
	
	//cout<<area(ab,ac,bc)<<endl;
	//cout<<area(ab*0.5,ac*0.5,bc*0.5)<<endl;
	
	double point=0;//记录对应的p值在哪里出现的 
	for(double i=l;i<=r;i+=0.0001)//i是p 
	{
		
		if(area(ab*i,ac*i,bc*i)<=minn)
		{
			 minn=area(ab*i,ac*i,bc*i);
			 //point=i;
		}
		
	}
//	printf("此程序出现的最小p值%.4f\n",point); 	
	printf("%.12f",minn); 

	return 0;
}

但是突发奇想,先算点坐标再用距离公式算出长度再算面积就过了,不知道是怎么回事))

#include<bits/stdc++.h>
using namespace std;

double area(double x,double y,double z)//计算三角形的面积 
{
	double p=(x+y+z)/2;
	return sqrt(p*(p-x)*(p-y)*(p-z)); 
}//!
int main()
{
	double l,r,x1,y1,x2,y2,x3,y3;
	double minn=1e9;
	cin>>l>>r>>x1>>y1>>x2>>y2>>x3>>y3;
	double ab=sqrt(pow((x1-x2),2)+pow((y1-y2),2)),
	ac=sqrt( pow((x2-x3),2) + pow((y2-y3),2) ),
	bc=sqrt(pow((x1-x3),2)+pow((y1-y3),2));	//!
	//cout<<area(ab,ac,bc)<<endl;
	//cout<<area(ab*0.5,ac*0.5,bc*0.5)<<endl;
	
	double point=0;//记录对应的p值在哪里出现的 
	for(double i=l;i<=r;i+=0.0001)//i是p 
	{
		double x4=(x2-x1)*i+x1,y4=(y2-y1)*i+y1,
		x5=(x1-x3)*i+x3,y5=(y1-y3)*i+y3,
		x6=(x3-x2)*i+x2,y6=(y3-y2)*i+y2;
		double q1=sqrt(pow((x4-x5),2)+pow((y4-y5),2)),
		q2=sqrt(pow((x5-x6),2)+pow((y5-y6),2)),
		q3=sqrt(pow((x4-x6),2)+pow((y4-y6),2));
		double s=area(q1,q2,q3);
		if(s<=minn) minn=s;
		/*if(area(ab*i,ac*i,bc*i)<=minn)
		{
			 //minn=area(min(ab*(1-i),ab*i),min(ac*(1-i),ab*i),min(bc*(1-i),ab*i));
			 minn=area(ab*(1-i),bc*(1-i),ac*(1-i));
			 point=i;	 
		}*/
		//minn=min(minn,area(ab*i,ac*i,bc*i));
	}
	//printf("此程序出现的最小p值:%.1f\n",point); 	
	printf("%.12f",minn); 

	return 0;
}
2024/5/4 20:02
加载中...