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 ...
随机推荐
- DATASNAP多表提交之事务控制之通用方法
ERP系统的单据,总是些主从表结构,有一个主表,N个子表,子表又有子表,形成N层,单据数据提交时,主从表数据都要提交,为了保证数据的完整性,必须提供事务控制,要么都提交成功,有一个提交失败所有的提交都 ...
- HTTP常见错误 400/401/403/404/500及更多
HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证 ...
- Codeforces Round #352 (Div. 2) D. Robin Hood (二分答案)
题目链接:http://codeforces.com/contest/672/problem/D 有n个人,k个操作,每个人有a[i]个物品,每次操作把最富的人那里拿一个物品给最穷的人,问你最后贫富差 ...
- libevent的使用方法--回显服务器的简单实例
#include <event.h> #include <sys/types.h> #include <sys/socket.h> #include <net ...
- 在数据库各种状态下查询DBID的五大类十种方法汇总
关于DBID: DBID是DataBase IDentifier的缩写,意思就是数据库的唯一标识符. 这个DBID在数据文件头和控制文件都是存在的,可以用于标示数据文件的归属. 对于不同数据库来说,D ...
- 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT) – 整理
当Adobe.Microsoft.Sun等一系列巨头开始表现出对”开源”的青睐时,”开源”的时代即将到来! 最初来自:sinoprise.com/read.php?tid-662-page-e-fpa ...
- 在C# WinForm程序中创建控件数组及相应的事件处理
控件数组是VB提供的一个优秀的设计解决方案,它能很方便快捷的处理大批同类控件的响应和时间处理,但不知为什么在C#中这个优秀特性没有传承下来,甚为可惜,本文将要探讨就是如何在C# WinForm程序实现 ...
- [PLL][PM]锁相环模拟相位解调
%锁相环测试 %模拟相位解调 clear close all clc fs=1000; %采样率 tend=100; t=0:1/fs:tend; t(end)=[]; fc=1; %载波频偏 fb= ...
- 一个Windows Service项目的完整开发过程
(一)建立项目文件 先建立一个解决方案文件,然后添加三个项目. 分别是: (1)Windows服务项目 -----ActiveMQSenderService项目,服务主要是定时轮询某表,将更新发送到 ...
- JAVA(2)——JDBC
刚接触JDBC的时候,有时候就在想,为什么java要用JDBC,而不是直接使用之前在VB中就学习过的ODBC,由于ODBC是在JDBC之前出现,所以ODBC肯定由于无法完毕某些操作或者不能非常顺利的完 ...