hihocoder 1237 Farthest Point
#1237 : Farthest Point
描述
Given a circle on a two-dimentional plane.
Output the integral point in or on the boundary of the circle which has the largest distance from the center.
输入
One line with three floats which are all accurate to three decimal places, indicating the coordinates of the center x, y and the radius r.
For 80% of the data: |x|,|y|<=1000, 1<=r<=1000
For 100% of the data: |x|,|y|<=100000, 1<=r<=100000
输出
One line with two integers separated by one space, indicating the answer.
If there are multiple answers, print the one with the largest x-coordinate.
If there are still multiple answers, print the one with the largest y-coordinate.
- 样例输入
-
1.000 1.000 5.000
- 样例输出
-
6 1 分析:
题目大意
给定平面直角坐标系中的一个圆,求圆内(可以在边界上)离圆心最远的整点。
解题思路
本题是一道简单的计算几何类题目。
要求园内的整点,即
x和y坐标均为整数的点,首先我们需要求出可能的x和y的范围。先考虑
x,显然x的上下界分别为x+r和x-r。由于题目给定的
x和r均为实数,因此x+r和x-r也可能不为整数。所以实际上包含在圆内的
x坐标上下界分别为floor(x+r)和ceil(x-r)。(floor表示下取整,ceil表示上取整),(如果使用强制转换类型则当(x+r)< 0 时会出错)在确定了
x以后,其对应的y坐标范围也可以随之确定。如下图所示,根据勾股定理,我们即可求出d的长度。
同时可以得到对应的
y坐标上下界为y+d至y-d。显然这两个值也有可能不为整数。因此实际的
y坐标范围为floor(y+d)和ceil(y-d)。通过这两个步骤,我们就可以得到所有在圆内的点:
For tx = floor(x+r) .. ceil(x-r)
d = sqrt(r*r - (tx-x)*(tx-x)) // 勾股定理
For ty = floor(y+d) .. ceil(y-d)
// (tx, ty) 是在圆内的点
// 更新比较最优点
End For
End For
由于本题给定的
r长度最大为100,000,则可能出现在圆内的点最大可能为314亿个点。直接枚举每个点来寻找最优值显然是不合理的,我们需要优化这个算法。
通过观察我们可以发现,在确定
x坐标之后,所有的y坐标中越靠近两端的点一定比靠近中间的点离圆心远。所以实际上我们只需要比较最两端的两个点,他们之中离圆心最远的点一定就是该
x坐标下离圆心最远的点。因此改进算法为:
ret_x = x
ret_y = y
For tx = floor(x+r) .. ceil(x-r)
d = sqrt(r*r - (tx-x)*(tx-x)) // 勾股定理
// 由于要求最大值,我们先考虑y坐标较大的一边
ty = floor(y+d)
If (tx,ty) is better than (ret_x, ret_y) Then
ret_x = tx
ret_y = ty
End If
// 再考虑坐标值较小的一边
ty = ceil(y-d)
If (tx,ty) is better than (ret_x, ret_y) Then
ret_x = tx
ret_y = ty
End If
End For
使用改进的算法时间复杂度为O(R),可以顺利的通过所有的测试点。
关于精度问题
在计算几何的计算中,精度问题是一个很常见的问题。
这是由于计算机存储浮点数时保留的精度有限而产生的。
即使用两个实型变量来存储同一个数字,都有可能产生误差。
因此在判定实型变量大小关系时,若直接采用
=,>或<进行比较,很有可能出错。一般常见的解决方法是设定一个极小量
epsilon(一般写作eps)来辅助比较。比如判定两个浮点数是否相等时,我们检查两个浮点数之间的差值。若差值小于
eps时,我们就认为这两个浮点数相等:equals(double x, double y):
eps = 1e-6 // 根据题目要求的精度范围来设定eps
If (abs(x - y) < eps) Then
Return True
End If
Return false
同样,其它比较符号也需要做对应的修改,具体可以参考下表:
原符号 修正
a == b abs(a-b) < eps
a != b abs(a-b) > eps
a > b a-b > eps
a >= b a-b > -eps
a < b a-b < -eps
a <= b a-b < eps出错点:将初始点设置为圆心。。。。试了很多次都没有完全对。。。于是采用了另一种办法,如下代码:
#include <stdio.h>
#include <math.h> double dis(double x, double y, double tx, double ty){
double dist = sqrt((tx - x) * (tx - x) + (ty - y) * (ty - y));
return dist;
} int main(){
double eps = 1e-;
double x, y, r;
int ret_x, ret_y, tx, ty;
double max = ;
scanf("%lf%lf%lf", &x, &y, &r);
for(tx = floor(x+r); tx >= ceil(x-r); tx--){
double d = sqrt(r*r - (tx - x) * (tx - x));
ty = floor(y + d);
if(dis(x, y, tx, ty) - max > eps){
ret_x = tx;
ret_y = ty;
max = dis(x, y, tx, ty);
}
ty = ceil(y - d);
if(dis(x, y, tx, ty) - max > eps){
ret_x = tx;
ret_y = ty;
max = dis(x, y, tx, ty);
}
}
printf("%d %d", ret_x, ret_y);
return ;
}
hihocoder 1237 Farthest Point的更多相关文章
- 【hihocoder】1237 : Farthest Point 微软2016校招在线笔试题
题目:给定一个圆,要你求出一个在里面或者在边上的整数点,使得这个点到原点的距离最大,如果有多个相同,输出x最大,再输出y最大. 思路:对于一个圆,里面整点个数的x是能确定的.你找到x的上下界就可以了. ...
- 微软往年校招招面试题AC全解。
因为4月初要参加微软的online.所以今天把微软的面试题拿出来做了,自己解答了题目.下面附上我的解答代码. -----------16年9月校招: 第一道题:Farthest Point(最远的整 ...
- hihocoder -1121-二分图的判定
hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...
- Hihocoder 太阁最新面经算法竞赛18
Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...
- hihoCoder太阁最新面经算法竞赛15
hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...
- 【hihoCoder 1454】【hiho挑战赛25】【坑】Rikka with Tree II
http://hihocoder.com/problemset/problem/1454 调了好长时间,谜之WA... 等我以后学好dp再来看为什么吧,先弃坑(╯‵□′)╯︵┻━┻ #include& ...
- 【hihocoder#1413】Rikka with String 后缀自动机 + 差分
搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...
- 【hihoCoder】1148:2月29日
问题:http://hihocoder.com/problemset/problem/1148 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 思路: 1. 将问题转换成求两个日 ...
- 【hihoCoder】1288 : Font Size
题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...
随机推荐
- codeforces 651A Joysticks
A. Joysticks time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- delphi 窗口最大化后控件的大小变化怎么设置
设置按钮的Anchors属性.可以通过此属性设置其边界是否随父类一起变化.默认akleft+aktop即左边界和上边界随窗口变化,也就是说如果窗口位置移动了,按钮将保持其left和top边界与窗口的距 ...
- 使用C#读取XML节点,修改XML节点
例子: <add key="IsEmptyDGAddRootText" value="" /> <!--是否可以修改归档状态档案 false: ...
- HDU 5441 Travel (并查集+数学+计数)
题意:给你一个带权的无向图,然后q(q≤5000)次询问,问有多少对城市(城市对(u,v)与(v,u)算不同的城市对,而且u≠v)之间的边的长度不超过d(如果城市u到城市v途经城市w, 那么需要城市u ...
- 最大流&最小割 - 专题练习
[例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...
- SpringMVC(四)
好久没有来谢谢总结性的东西了,一直在赶项目进度,终于忙完了,今天就来说说项目过程中遇到的一些问题: 1.关于在使用@Param的用法,在前面也说过了一点,但是在实际使用中还遇到了一个问题.就是在Map ...
- vsftpd 权限设置
vsftpd 虚拟用户 多用户不同权限 2010-06-27 00:54:20| 分类: linux大杂绘|举报|字号 订阅 1.需要建立一个用户,这个用户是linux系统的本地用户,各ft ...
- zookeeper 系列
ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂易出错的关键服务 ...
- MEF 编程指南(五):延迟导出
在组合部件的时候,导入将会触发部件(部件集合)的实例化,为原始的请求部件公开必要的导出需求.对于有些应用程序,推迟实例化 - 并且防止递归组合图(Recursive Composition Down ...
- 【Winform】Winform 制作一键发布web
前言 最近web网站有个需要,就是打包给客户,客户能够自己手动的进行傻瓜式的安装发布web.找了很多资料,其中涉及到 文件解压 IIS操作 数据库还原 等. 发现现在就主要是两种解决方案: ①:使用V ...