Careercup - Google面试题 - 4877486110277632

2014-05-08 05:16

题目链接

原题:

Given a circle with N defined points and a point M outside the circle, find the point that is closest to M among the set of N. O(LogN)

题目:给定一个圆上的N个点,和一个在这个圆外部的点。请找出这N个点中与外部点最近的那个。要求时间复杂度是对数级的。

解法1:这位“Guy”老兄又出了一道莫名奇妙的题:1. 这些点是等距离的吗?2. 这些点是顺时针还是逆时针排列的?在没有比较清楚思路的情况下,我只写了个O(n)枚举的算法。

代码:

 1 // http://www.careercup.com/question?id=4877486110277632
 2 #include <cmath>
 3 #include <iostream>
 4 #include <vector>
 5 using namespace std;
 6 
 7 struct Point {
 8     double x;
 9     double y;
10     Point(double _x = 0, double _y = 0): x(_x), y(_y) {};
11 };
12 
13 double dist(const Point &p1, const Point &p2)
14 {
15     return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
16 }
17 
18 int main()
19 {
20     int i, n;
21     Point pout;
22     vector<Point> vp;
23     int min_i;
24     double d, min_d;
25     
26     while (cin >> n && n > 0) {
27         vp.resize(n);
28         for (i = 0; i < n; ++i) {
29             cin >> vp[i].x >> vp[i].y;
30         }
31         cin >> pout.x >> pout.y;
32         
33         min_i = 0;
34         min_d = dist(pout, vp[0]);
35         for (i = 1; i < n; ++i) {
36             d = dist(pout, vp[i]);
37             min_i = d < min_d ? i : min_i;
38         }
39         cout << '(' << vp[min_i].x << ',' << vp[min_i].y << ')' << endl;
40         cout << min_d << endl;
41         vp.clear();
42     }
43     
44     return 0;
45 }

 解法2:实际上这题不但有对数级算法,还有常数级算法。但有一个额外条件需要满足:我得知道圆心在哪儿。计算圆心需要把所有点的坐标求平均值,那样的算法复杂度还是线性的。如果我们定义P[i]为圆上的那N个点,O为圆心,M为圆外的那个点。那么我们连接OP[i]与OM,可以发现OM与OP[i]的夹角分布是循环有序的(参见Leetcode里面的Rotated Sorted Array),条件是这N个点呈顺时针或逆时针分布。你可以通过二分得到距离最小的结果,但更快的算法是常数级的。你只要计算一个夹角,就知道所有的了。因为这些夹角是个等差数列。比如四个点中,有一个的夹角是73°,那么另外三个肯定是163°、107°(253°)、17°(343°)。谁的距离最短呢?角度最小的就是了,注意优角要换算成锐角或钝角。想要通过一次计算就解决问题,用除法和取模的思想吧。此处的代码默认点是按照顺时针排列的,否则为了判断哪个方向,又得进行一些计算。那样的话,代码都乱的看不清楚了。

代码:

 1 // http://www.careercup.com/question?id=4877486110277632
 2 #include <cmath>
 3 #include <iostream>
 4 #include <vector>
 5 using namespace std;
 6 
 7 struct Point {
 8     double x;
 9     double y;
10     Point(double _x = 0, double _y = 0): x(_x), y(_y) {};
11     
12     Point operator - (const Point &other) {
13         return Point(x - other.x, y - other.y);
14     };
15 
16     Point operator + (const Point &other) {
17         return Point(x + other.x, y + other.y);
18     };
19 
20     double operator * (const Point &other) {
21         return x * other.x + y * other.y;
22     };
23 };
24 
25 double dist(const Point &p1, const Point &p2)
26 {
27     return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
28 }
29 
30 int main()
31 {
32     int i, n;
33     Point pout;
34     vector<Point> vp;
35     Point center;
36     Point v0, vout;
37     // the angle between OM and a line of center
38     double angle;
39     // 2 * pi / n
40     double side_angle;
41     const double pi = 3.1415926;
42     double d;
43     
44     while (cin >> n && n > 0) {
45         vp.resize(n);
46         for (i = 0; i < n; ++i) {
47             cin >> vp[i].x >> vp[i].y;
48             
49         }
50         cin >> center.x >> center.y;
51         cin >> pout.x >> pout.y;
52         
53         v0 = vp[0] - center;
54         vout = pout - center;
55         
56         side_angle = 2 * pi / n;
57         angle = arccos((v0 * vout) / (dist(vp[0], center) * dist(pout, center)));
58         d = angle / side_angle;
59         // Here I assume the points are arranged in clockwise order.
60         i = d - floor(d) < 0.5 ? floor(d) : floor(d) + 1;
61         cout << vp[i].x << ' ' << vp[i].y << endl;
62         
63         vp.clear();
64     }
65     
66     return 0;
67 }

 

转载于:https://www.cnblogs.com/zhuli19901106/p/3715309.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之adb shell dumpsys activity获取task里面的所有actitiy

android 如何在开启一个activity的时候清除所有前面的Activity intent intent new Intent();intent.addFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent); 在控制台输入&#xff1a; db shell dumpsys activity获取task里面的所有activity 图片就不给了&#xff…

MySQL使用详解--根据个人学习总结

1.安装配置 2.启动mysql服务并配置 mysql> \s&#xff08;status也行&#xff09;查看当前服务器状态查看编码状态Server characterset : utf8Db characterset: utf8Client characterset: gbkConn. characterset: gbk修改&#xff1a;---进入配置文件my.ini客户端&#xff1…

送什么给女朋友最致命?

1 啊&#xff0c;原来里面有说明书&#xff08;via.豆瓣哈组&#xff0c;侵删&#xff09;▼2 网友给女朋友准备的惊喜&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 这个泰国小哥的创意真棒&#xff08;via.阿森不是妖怪&#xff0c;侵删&#xff09;▼4 老婆的…

如何修改 匿名类型 中的属性值 ?

咨询区 Leo Vo我有下面一段代码&#xff1a;var output new {NetSessionId string.Empty };foreach (var property in output.GetType().GetProperties()) {property.SetValue(output, "Test", null); }代码运行后&#xff0c;它会抛出如下异常&#xff1a;Propert…

SWF反编译神器ASV2013功能展示(下)

动作脚本菜单动作脚本-查看元件类动作脚本-编辑AS3常量池动作脚本-ASV内部ABC数据浏览器窗口菜单 选项菜单-帧视图选项 选项菜单-预览窗口选项选项菜单-时间线视图选项选项菜单-库视图选项 选项菜单-动作脚本视图选项实用工具菜单 关于对话框 转载于:https://blog.51cto.com/as…

Andorid之taskAffinity 和 FLAG_ACTIVITY_NEW_TASK

taskAffinity 和 FLAG_ACTIVITY_NEW_TASK都是和activity启动时是否需要新建一个task有关&#xff0c;我们分四种情况看一下这两个标志对启动activity的影响&#xff1a;(前提&#xff1a;从MainActivity中启动ActivityA) 1)、两个标志都不设置 2)、有FLAG_ACTIVITY_NEW_TASK …

【项目 报错】 项目启动,内存溢出 可能出现的各种报错

内存溢出可能有如下的错误&#xff1a; 错误1&#xff1a; java.lang.OutOfMemoryError: PermGen space 错误2&#xff1a; Exception in thread "http-apr-8080-exec-2" 出现如上的错误&#xff0c;解决方法如下&#xff1a; 1.双击Tomcat 2.点击open launch config…

杨中科的.NET 6新书的出版进度汇报

各位朋友好&#xff0c;我有3个月没发公众号了&#xff0c;今天打扰大家一下&#xff0c;不好意思。最近这3个月&#xff0c;我在忙着给我的.NET 6新书收尾&#xff0c;并且在.NET 6正式版发布后&#xff0c;我把书中用.NET 6 预览版编写的内容在.NET 6正式版中又验证了一遍&am…

2021,如何找到适合自己的圈子?

全世界只有3.14 % 的人关注了爆炸吧知识蔡康永分享过这样一段话&#xff1a;“小S的个性本身就是很乐天&#xff0c;很有活力&#xff0c;她这个朋友让我觉得活着是一件很值得、很舒服、很有趣的事。而有的人会让我觉得活着很没劲&#xff0c;碰到他会把我的能量都吸走”。你和…

Android之用Intent.FLAG_ACTIVITY_CLEAR_TOP解决界面重复拉起问题

今天遇到了一个问题: 就是界面在服务拉起来用的Intent.FLAG_ACTIVITY_NEW_TASK导致登录界面拉起很多次,登录还要登录,主要是之前的activity没有关闭 用it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP)解决。 A - B - C 当 B - A - B 跳转的时…

抓图实例

//调用动态链接库gdi32.dll[ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]private static extern bool BitBlt (IntPtr hdcDest , //目标设备的句柄int nXDest , // 目标对象的左上角的X坐标int nYDest , // 目标对象的左上角的X坐标int nW…

代码Review发现问题

FrmMain.cs中存在问题 1. int i0 设定为了全局常量且未在类顶部&#xff0c;出现问题时不好查找 i 属于常用临时变量&#xff0c;设定全局变量容易引起混乱 2.定义的全局变量但仅在一处方法中使用&#xff0c;定义全局变量过多 3.变量名及控件名等意义不明确又缺少注释&#xf…

I/O多路转接之poll——基于TCP协议

1. 函数a. 参数&#xff1a;&#xff08;1&#xff09;fds:是一个struct pollfd结构类型的指针&#xff0c;指向用于存放需要检测状态的Socket描述符&#xff1b;每当调用这个函数之后&#xff0c;系统不会清空这个数组&#xff0c;操作起来比较方便&#xff1b;特别是对于sock…

Android之 FLAG_ACTIVITY_CLEAR_TASK

FLAG_ACTIVITY_CLEAR_TASK :如果在调用Context.startActivity时传递这个标记&#xff0c;将会导致任何用来放置该activity的已经存在的task里面的已经存在 的activity先清空&#xff0c;然后该activity再在该task中启动&#xff0c;也就是说&#xff0c;这个新启动的activity变…

C# 日志管理框架:Common.Logging和log4net

01—DLL引用‍common logging是一个通用日志接口框架&#xff0c;log4net是一个强大的具体实现框架. common logging可以把输出连接到其他非log类上, 如EntLib的日志、NLog等‍‍‍‍‍‍‍‍‍‍‍‍‍‍项目中需要引入的DLL:Common.Logging.dllCommon.Logging.Core.dllCommon…

boost常用记录

1.BOOST_FOREACH 经常会遍历容器&#xff0c;写for/while循环到手痛&#xff0c;使用BOOST_FOREACH可以减少我们的工作。支持容器vector/list/set/deque/stack/queue#include <boost/foreach.hpp> BOOST_FOREACH(value,container){ //遍历每个元素 } 例子&#xff1a; ve…

Cacti迁移RRA数据迁移脚本

迁移程序和数据库完成后&#xff0c;默认的rra数据并不能出图&#xff0c; 需要从旧机器上将rra数据导出到新机器上&#xff0c;附上脚本 #导出rra数据 #!/bin/bash rrddump"/usr/bin/rrdtool dump" xmldir/data/rraxml/ rradir/var/www/html/cacti/rra/ for file in…

Android之FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_SINGLE_TOP :如果当前栈顶的activity就是要启动的activity,则不会再启动一个新的activity实例&#xff1a;我们有一个apk&#xff0c;apk中包含两个Activity:MainActivity和ActivityA&#xff0c;点击MainActivity启动ActivityA,点击ActivityA还是启动ActivityA&…

我开发了一个对.NET程序进行瘦身的工具

我开发了一个对.Net程序瘦身的工具&#xff0c;可以把被引用但是没有被使用的程序集删除。我用它把一个.Net core程序从147兆瘦身到59.5兆。.NET中发布程序的时候有对程序集进行剪裁的功能&#xff0c;但是那个功能只能做静态检查。比如我们的项目使用了A程序集&#xff0c;A程…