HDU 2073 无限的路(水)

纠结时A一发还是很爽的


  • 原题链接:Here!

  • 分析:把问题分解成求两个点到初始点的距离,这两个点的距离就是差。

  • 如何计算图中一个点到起始点的距离?

    设直线方程为 y+x=c 可以看到图中被 橙、黄、绿标记的直线c是不同的,也就是说c可以区分不同直线。
    ok,我们来算倾斜的线(棕色)的长度incline,假设求第三个倾斜的线(0,3)->(2,0),其长度为 sqrt( 3*3 + 2*2 )。
    直线上的长度是一个等差数列,an=(n-1)*sqrt(2) ,( 从(0,0)开始 ),只需要把前c-1条直线的长度求和即可。
    最后是求点到所在直线端点的长度,观察图可以发现点的横坐标x代表这个点是这条直线上的第几个点,所以.....

  • CODE:
    /*
    	Note:
    		把问题分解成求两个点到初始点的距离,这两个点的距离就是差 
    */
    #include<cstdio>
    #include<cmath>
    using namespace std;
    //#define test
    
    double Length(int x,int y){	// 求点(x,y)到出发点的距离
    	int 	c = x+y;
    	double  incline = 0;
    	for(int i=1;i<=c;i++)	incline += sqrt((i*i+(i-1)*(i-1)));		// 计算倾斜长度
    	double  straight = c*(c-1)/2*sqrt(2) + x*sqrt(2);
    	return 	straight + incline;
    }
    int main(){
    	int n;
    	#ifdef test
    		freopen("Hdu 2073 无限的路.txt","r",stdin);
    	#endif
    	scanf("%d",&n);
    	while(n--){
    		int x1,y1,x2,y2;
    		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    		if(x1==x2 && y1==y2)	printf("0.000\n");
    		else{
    			double s1=Length(x1,y1) , s2=Length(x2,y2);
    			printf("%.3lf\n",fabs(s1-s2));
    		}
    	} 
    	return 0;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值