无限的路
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 17057 Accepted Submission(s): 9455
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
图像问题解题思路(新人菜鸡,有问题的地方求大佬多多指点):
1.明确已知量和要求量。
2.分析图像,用特殊点推导规律,将大问题变成多个小问题。
3.根据规律推导公式,解出题目.
此题思路:
求两点之间的距离=一点到(0,0)的距离减去另一个点到(0,0)的距离。
所以问题变成求一个点到(0,0)的距离。
任何一点都可以拆分成两个部分:由(0,0)到(x,0)距离在减去要求点到(x,0)的距离。
以(1,1)为例:
红色部分((1,1)到(0,0)的距离))=(0,0)到(2,0)的距离-蓝色部分
所以要知道两个部分:1.(0,0)到(x,0)的距离
2.蓝色部分的距离
先解决第一部分:
以(2,0)为例:
距离=根号下(2*2+2*2)+根号(2*2+1*1)+(0,0)到(1,0)的距离;
所以代码为
for(int i=1;i<=205;i++)
{
arr[i]=arr[i-1]+sqrt(1.0*i*i+1.0*i*i)+sqrt(1.0*i*i+1.0*(i-1)*(i-1));
}
在解决第二部分:
蓝色部分距离怎么求,就是要知道下标(2,0),不难发现2=1+1,所以推测x=点的横坐标加纵坐标
多举几个例子发现没有问题,规律就出来了。
所有问题解决,ac代码:
#include<iostream>
#include<math.h>
#include<stdio.h>
using namespace std;
int main()
{
int n;
int a,b,c,d,m;
double arr[210];
double x,y;
cin>>n;
arr[0]=0;
for(int i=1;i<=205;i++)
{
arr[i]=arr[i-1]+sqrt(1.0*i*i+1.0*i*i)+sqrt(1.0*i*i+1.0*(i-1)*(i-1));
}
while(n--)
{
cin>>a>>b>>c>>d;
if(a==0&&b==0)
{
x=0;
}
else
{
m=a+b;
x=arr[m]-sqrt(1.0*b*b*2);
}
if(c==0&&d==0)
{
y=0;
}
else
{
m=c+d;
y=arr[m]-sqrt(1.0*d*d*2);
}
printf("%.3lf\n",fabs(x-y));
}
return 0;
}