HDU 2671

这是我们校内赛里的比赛里的题目。。。赛后做了。。。太坑了。。做了快两小时。。一开始没有考虑到A B点在直线不同侧的情况。例子怎么都过不了。。现在终于做出来了。。好久没有这么爽的感觉了。。。


题意:给出斜率K和A B C三个点的坐标。有一条斜率为K并经过点C的直线。在直线上取一点P,求min|AP+BP|。

分两种情况: A B不同侧和同侧     (对称点的坐标公式在网上找的)

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int main()
{
	double k, ax,ay,bx,by,cx,cy,dx,dy;
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lf%lf%lf%lf%lf%lf%lf",&k,&ax,&ay,&bx,&by,&cx,&cy);
		double c=-k*cx+cy;
		double a=k;
		double b=-1;
		//dx=((b*b-a*a)*ax-2*a*b*ay-2*a*c)/(a*a+b*b);
	//	dy=((a*a-b*b)*ay-2*a*b*ax-2*c*b)/(a*a+b*b);
		if((a*ax+b*ay+c)*(a*bx+b*by+c)>=0)
		{
		dx=ax-(2*a*(a*ax+b*ay+c))/(a*a+b*b);
		dy=ay-(2*b*(a*ax+b*ay+c))/(a*a+b*b);	
		double dis=sqrt((dx-bx)*(dx-bx)+(dy-by)*(dy-by));
				 printf("%.2lf\n",dis);
		}
		else
		{
			printf("%.2lf\n",sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)));
		}

	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值