#1237 : Farthest Point

时间限制:5000ms
单点时限:1000ms
内存限制:256MB

描述

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

分析:

题目大意

给定平面直角坐标系中的一个圆,求圆内(可以在边界上)离圆心最远的整点。

解题思路

本题是一道简单的计算几何类题目。

要求园内的整点,即xy坐标均为整数的点,首先我们需要求出可能的xy的范围。

先考虑x,显然x的上下界分别为x+rx-r

由于题目给定的xr均为实数,因此x+rx-r也可能不为整数。

所以实际上包含在圆内的x坐标上下界分别为floor(x+r)ceil(x-r)。(floor表示下取整,ceil表示上取整),(如果使用强制转换类型则当(x+r)< 0 时会出错

在确定了x以后,其对应的y坐标范围也可以随之确定。如下图所示,根据勾股定理,我们即可求出d的长度。

同时可以得到对应的y坐标上下界为y+dy-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的更多相关文章

  1. 【hihocoder】1237 : Farthest Point 微软2016校招在线笔试题

    题目:给定一个圆,要你求出一个在里面或者在边上的整数点,使得这个点到原点的距离最大,如果有多个相同,输出x最大,再输出y最大. 思路:对于一个圆,里面整点个数的x是能确定的.你找到x的上下界就可以了. ...

  2. 微软往年校招招面试题AC全解。

    因为4月初要参加微软的online.所以今天把微软的面试题拿出来做了,自己解答了题目.下面附上我的解答代码. -----------16年9月校招:  第一道题:Farthest Point(最远的整 ...

  3. hihocoder -1121-二分图的判定

    hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...

  4. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

  5. hihoCoder太阁最新面经算法竞赛15

    hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...

  6. 【hihoCoder 1454】【hiho挑战赛25】【坑】Rikka with Tree II

    http://hihocoder.com/problemset/problem/1454 调了好长时间,谜之WA... 等我以后学好dp再来看为什么吧,先弃坑(╯‵□′)╯︵┻━┻ #include& ...

  7. 【hihocoder#1413】Rikka with String 后缀自动机 + 差分

    搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...

  8. 【hihoCoder】1148:2月29日

    问题:http://hihocoder.com/problemset/problem/1148 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 思路: 1. 将问题转换成求两个日 ...

  9. 【hihoCoder】1288 : Font Size

    题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...

随机推荐

  1. Spring Filter components in auto scanning

    In this Spring auto component scanning tutorial, you learn about how to make Spring auto scan your c ...

  2. TextKit学习(三)NSTextStorage,NSLayoutManager,NSTextContainer和UITextView

    先上一张图: 这是使用UITextView时用到的iOS7新增加的类:NSTextContainer.NSLayoutManager.NSTextStorage及其相互关系: 这三个新出的类还没有在官 ...

  3. HDU 3668 Volume (数学,积分)

    题意:求图中交叉圆柱体的体积! 析:大体思路很明确,把两个圆柱的体积加起来 减去中间公共部分的即可!第一步首先得想到公共部分是一个怎样的图形.这个在高数下册例题中有讲到! 中间实线部分就是第一卦限内的 ...

  4. Installation Directory must be on a local hard drive解决办法

    今天带着公司的电脑来杭州这边,同事发来一个Sliksubversion.msi来进行安装,由于系统是win8.1的,直接点击安装不了,真的是醉了,于是乎发挥度娘的力量找到了答案,这里贴出来,供大家来参 ...

  5. 【转】Android真机抓屏- Android Screen Monitor

    http://www.cnblogs.com/xiaofeixiang/p/4086092.html 一般运行Android应用程序有两种方式一种是设置Android虚拟设备模拟器,通过Android ...

  6. Select模型原理

    Select模型原理 利用select函数,推断套接字上是否存在数据,或者是否能向一个套接字写入数据.目的是防止应用程序在套接字处于锁定模式时,调用recv(或send)从没有数据的套接字上接收数据, ...

  7. MFC Windows程序设计源代码免费下载

    本人近期在网上找到了<MFC Windows程序设计>第二版的书内程序的源代码,特意上传CSDN上面,供学习MFC的程序猿们免费下载. 源代码下载: http://download.csd ...

  8. C++指针和引用

     ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名.  ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指 ...

  9. mysql 5.6 原生Online DDL解析

    http://seanlook.com/2016/05/24/mysql-online-ddl-concept/ 做MySQL的都知道,数据库操作里面,DDL操作(比如CREATE,DROP,ALTE ...

  10. sql 事务处理

    事务定义: 事务是单个的工作单元.如果某一事务成功,则在该事务中进行的所有数据更改均会 提交,成为数据库中的永久组成部分.如果事务遇到错误且必须取消或回滚,则所有 数据更改均被清除. 事务三种运行模式 ...