无限的路
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7773 Accepted Submission(s): 4017
Problem Description
甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形:
甜甜的好朋友蜜蜜发现上面的图还是有点规则的,于是他问甜甜:在你画的图中,我给你两个点,请你算一算连接两点的折线长度(即沿折线走的路线长度)吧。
甜甜的好朋友蜜蜜发现上面的图还是有点规则的,于是他问甜甜:在你画的图中,我给你两个点,请你算一算连接两点的折线长度(即沿折线走的路线长度)吧。
Input
第一个数是正整数N(≤100)。代表数据的组数。
每组数据由四个非负整数组成x1,y1,x2,y2;所有的数都不会大于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
Author
Lily
Source
打出了所有点到上一个点的距离,然后求点之间的距离的时候,就转化成这两个点到原点距离之差就行了。
代码如下:
#include <cstdio>
#include <cmath>
int main()
{
double a[21000];
a[1] = 0;
a[2] = 1;
double b1 = 1;
double b2 = 2;
int num = 1;
int t = num;
for (int i = 3 ; i <= 21000 ; i++)
{
if (t != 0)
{
a[i] = sqrt(2.0);
t--;
}
else
{
a[i] = sqrt (b1*b1 + b2*b2);
b1++;
b2++;
num++;
t = num;
}
}
// for (int i = 1 ; i <= 40 ; i++)
// printf ("%.3lf ",a[i]);
int u;
scanf ("%d",&u);
while (u--)
{
int x1,x2,y1,y2;
scanf ("%d %d %d %d",&x1,&y1,&x2,&y2);
int n1,n2;
n1 = (1 + x1 + y1) * (x1 + y1) / 2 + x1 + 1;
n2 = (1 + x2 + y2) * (x2 + y2) / 2 + x2 + 1;
if (n2 < n1)
{
int k;
k = n1;
n1 = n2;
n2 = k;
}
else if (n1 == n2)
{
printf ("0\n");
continue;
}
double ans = 0;
for (int i = n1+1 ; i <= n2 ; i++)
ans += a[i];
printf ("%.3lf\n",ans);
}
return 0;
}