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 ...
随机推荐
- codeforce 621A(水题)
A. Wet Shark and Odd and Even time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- MSGPACK(一)
MSGPACK跨平台的数据序列规范,为多种语言所支持.用它序列还是还原数据都异常方便. 而且它支持序列的数据格式非常之多,因为它支持的数据格式多,所以MSGPACK的第二功用:缓存. DELPHI的M ...
- php编程冒泡排序
<?//冒泡排序法 function bubble_sore($array) { $count = count($array); if ($count < 0) { return fals ...
- UVaLive 7270 Osu! Master (统计)
题意:给定 n 个元素,有的有一个值,如果是 S 那么是单独一个,其他的是一个,求从 1 开始的递增的数量是多少. 析:那么S 是单独的,要统计上,既然是从 1 开始递增的,那么再统计 1 的数量即可 ...
- mysql全库备份数据库脚本
#!/bin/sh DATE=`date +%Y%m%d` DEL_DATE=$(date -d '-30 days' "+%Y%m%d") HOST USER=admin PAS ...
- 小谈chrome调试命令:console.log的使用
相信从事前端开发的您,一定不会陌生Mozilla五星级推荐的一款插件:firebug,它是如此强大,乃至于我们可以很方便地调试DHTML的近乎所有元素.而在它深邃的机体里,还存有一个命令:consol ...
- [cocos2d-x3.0]Xcode 升级到5.1后,cocos2d-x3.0 编译64bit出错解决方案
转自:http://blog.csdn.net/blucenong/article/details/21198089 把Architectures --->Other 改成 $(ARCHS_ST ...
- ArcObjects SDK(AE)10.1在vs2012安装的方法
ArcObjects SDK(以下简称AO)10.1只支持vs2010,如果装了vs2012,再安装AO会提示一串鸡肠(英文),意思是AO10.1只支持vs2010 想在2012下安装,可以通过修改注 ...
- codeforces 468B 2-sat
今天明确了2-SAT; 表示对一对整数之间的关系是否存在 #include<cstdio> #include<algorithm> #include<iostream&g ...
- Apache Solr采用Java开发、基于Lucene的全文搜索服务器
http://docs.spring.io/spring-data/solr/ 首先介绍一下solr: Apache Solr (读音: SOLer) 是一个开源.高性能.采用Java开发.基于Luc ...