题意:根据图中路线的规则,判断(a,b)点到(c,d)点的路径长
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2073
思路:(0,0)到每个(0,a+b)点的路径长有规律,增加一个变量k,k=a+b,dis(a,b)表示(0,0)到(a,b)的距离。dis(0,k) = sqrt [k^2 + (k-1)^2] + sqrt(2) * (k-1) + dis(0,k-1),并且dis(a,b) = dis(0,k) + sqrt(2) * a,由此可以推出两点间的距离为dis(c,d) - dis(a,b) = dis(0, c+d) + sqrt(2) * c - dis(0, a+b) - sqrt(2) * a
注意点:无
以下为AC代码:
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
12646032 | 2015-01-04 23:15:10 | Accepted | 2073 | 15MS | 1320K | 1333 B | G++ | luminous11 |
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(), (x).end()
#define clr(a, v) memset( a , v , sizeof(a) )
#define pb push_back
#define mp make_pair
#define read(f) freopen(f, "r", stdin)
#define write(f) freopen(f, "w", stdout)
using namespace std;
int main()
{
int n;
double num[10005];
clr ( num, 0 );
for ( int i = 1; i < 10005; i ++ )
{
num[i] = ( sqrt(2) * ( i - 1 ) + sqrt( ( i - 1 ) * ( i - 1 ) + i * i ) ) + num[i-1];
}
cin >> n;
while ( n -- )
{
int a, b, c, d;
cin >> a >> b >> c >> d;
int m, n;
m = a + b;
n = c + d;
if ( m < n )
{
swap( m, n );
swap( a, c );
swap( b, d );
}
double ans = ( num[m] + sqrt(2.0) * a ) - ( num[n] + sqrt(2.0) * c );
if ( ans < 0 )ans = - ans;
cout << fixed << setprecision(3) << ans << endl;
}
return 0;
}