1.26 [hduoj] 2073 无限的路
作者:互联网
Problem Description
甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形:
甜甜的好朋友蜜蜜发现上面的图还是有点规则的,于是他问甜甜:在你画的图中,我给你两个点,请你算一算连接两点的折线长度(即沿折线走的路线长度)吧。
Input
第一个数是正整数N(≤100)。代表数据的组数。
每组数据由四个非负整数组成x1,y1,x2,y2;所有的数都不会大于100。
Output
对于每组数据,输出两点(x1,y1),(x2,y2)之间的折线距离。注意输出结果精确到小数点后3位。
Sample Input
5
0 0 0 1
0 0 1 0
2 3 3 1
99 99 9 9
5 5 5 5
Sample Output
1.000
2.414
10.646
54985.047
0.000
#include<stdio.h>
#include<math.h>
#define G2 sqrt(2)
double result;
int xx1,xx2,yy1,yy2,s1,s2,n;
double p2(int a,int b)
{
double part2=0;
for(int i=a;i<b;i++)
part2+=sqrt(i*i+(i+1)*(i+1));
return part2;
}
double p1(int a,int b)
{
double part1=0;
for(int i=a+1;i<b;i++)
part1+=G2*i;
return part1;
}
void main()
{
while(scanf("%d",&n)!=EOF)
{
while(n--)
{
int flag=0;
scanf("%d%d%d%d",&xx1,&yy1,&xx2,&yy2);
s1=xx1+yy1;
s2=xx2+yy2;
if(s1>s2)
{
int temp;
temp=s1;
s1=s2;
s2=temp;
flag=1;
}
if(s2-s1==0)
result=sqrt((xx1-xx2)*(xx1-xx2)+(yy1-yy2)*(yy1-yy2));
if(s2-s1==1)
{
if(flag==0)
result=sqrt((xx1-s1)*(xx1-s1)+yy1*yy1)+sqrt(s1*s1+s2*s2)+sqrt(xx2*xx2+(yy2-s2)*(yy2-s2));
if(flag==1)
result=sqrt((xx2-s1)*(xx2-s1)+yy2*yy2)+sqrt(s1*s1+s2*s2)+sqrt(xx1*xx1+(yy1-s2)*(yy1-s2));
}
if(s2-s1!=0&&s2-s1!=1)
{
if(flag==0)
result=sqrt((xx1-s1)*(xx1-s1)+yy1*yy1)+sqrt(xx2*xx2+(yy2-s2)*(yy2-s2))+p1(s1,s2)+p2(s1,s2);
if(flag==1)
result=sqrt((xx2-s1)*(xx2-s1)+yy2*yy2)+sqrt(xx1*xx1+(yy1-s2)*(yy1-s2))+p1(s1,s2)+p2(s1,s2);
}
printf("%.3lf\n",result);
}
}
}
这题我觉得不好下手,得慢慢琢磨规律。
首先,我发现根据函数,同一条线上的点,横坐标与纵坐标的和相同。
然后我把x+y=n 这个函数所在的线称为“正经的线”,从x+y=n-1过渡到x+y=n的线称为“业余的线”
我们把要算的线分成三个部分,第一个部分是除去这两个点所在的正经的线,第二个部分是所有业余的线,最后一部分是这两个点所在的正经的线。
先把这两个点的横坐标和纵坐标相加,如果相加差等于0,就直接算这两个点之间的距离就好;如果相加差等于1,就算第二部分和第三部分就好。如果大于1,那三个部分都要算。
棉毛裤穿吗 发布了153 篇原创文章 · 获赞 4 · 访问量 3782 私信 关注
标签:xx2,xx1,yy2,s2,s1,hduoj,sqrt,2073,1.26 来源: https://blog.csdn.net/qq_39782006/article/details/104079370