题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2073
这道题目关键就是找规律,规律找出来了就很简单。
注意x1+y1和x2+y2,可以判断在哪一条直线上面,因为每一条直线上面的横纵坐标之和恒定。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
using namespace std;
/*
freopen("input.txt", "r", stdin); //读数据
freopen("output.txt", "w", stdout); //注释掉此句则输出到控制台
*/
int main()
{
int i,t,x1,x2,y1,y2;
cin>>t;
while(t--)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int a=x1+y1,b=x2+y2;//a,b表示在哪条直线上
if(a>b)
{
swap(x1,x2);swap(y1,y2);swap(a,b);
}
double sum=0;
if(a==b)//在同一条直线上直接求两点之间的距离
{
sum=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
else
{ //这个地方,因为a,b做除数,所以有分类判断是否为0
if(a==0&&b==0)
sum=0;
else if(a!=0&&b!=0)
sum=a*sqrt(2.0)*y1/a+b*sqrt(2.0)*x2/b;
else if(a==0)
sum=b*sqrt(2.0)*x2/b;
else
sum=a*sqrt(2.0)*y1/a;
for(i=a+1;i<b;i++)
sum+=sqrt(i*i+(i-1)*(i-1))+i*sqrt(2.0);
sum+=sqrt(b*b+(b-1)*(b-1));
}
printf("%.3f\n",sum);
}
return 520;
}
本文介绍了一道来自杭州电子科技大学在线评测系统的题目(HDU 2073),通过寻找规律简化问题解决过程。文章提供了完整的代码实现,并详细解释了如何根据输入坐标确定所在直线及计算距离的方法。

202

被折叠的 条评论
为什么被折叠?



