题目链接

https://ac.nowcoder.com/acm/contest/23479/D

题面

思路

每一秒都有一个方向向量,然后每一秒都往这个方向移动一次,那么小红和小果之间的距离就只有三种情况

  • 第一种就是当前位置(没移动)到小果的距离
  • 第二种就是终点位置(移动后)到小果的距离
  • 第三种就是小果到这个移动线段(起点到终点)的距离
    那么我们直接分三种情况去一个min就好了
    关于点到线的距离博客讲解:https://blog.csdn.net/angelazy/article/details/38489293

附上出题人的讲解(非常详细)


本题要求一个固定的点到一条折线的最短距离。由于折线可以看成是很多条线段,所以可以规约成点到线段的最短距离。

(虽然这个是板子,但不建议直接去百度,毕竟赛场上没有百度)

显然,最终的答案一定为以下两种情况的一种:点到直线的最短距离、或点到线段某个端点的最短距离。

什么时候会遇到第二种情况呢?当且仅当点到直线的最短距离所对应的那个点不在线段上。

所以这道题一个最笨的方法就是:先根据线段求出直线两点式,然后求斜率乘积为-1(这样才能垂直)的直线,求出点斜式(还要特判斜率不存在的情况),这样求出两个直线交点,判断交点在不在线段上。如果在的话直接输出初始点到交点距离,否则输出初始点到线段两个端点的最小那个距离。

如果这道题用这种方法来做,计算量将非常大,题目难度也直接飙上1700+。事实上,本题有更简单的做法:

首先如何判断最终能不能取到点到直线距离呢?很简单,把点 PP 和线段两个端点 AA 和 BB ,这三个点连接成一个三角形,判断该三角形的角 AA 和角 BB 是否是钝角即可。判断钝角可以直接用勾股定理:a2+b2<c2a^2+b^2<c^2a2+b2<c2则角 C 为钝角。

然后如何求点到直线的距离呢?也很简单,P到直线ABAB 的距离即三角形 PABPAB 中ABAB边上的高。直接用 2∗SABC/AB2*S_{ABC}/AB2∗SABC​/AB

/AB即可。而三角形面积可以直接用海伦公式:S=p∗(p−a)∗(p−b)∗(p−c)S=\sqrt{p*(p-a)*(p-b)*(p-c)}S=p∗(p−a)∗(p−b)∗(p−c)​
可以发现,换一个做法,原本计算量巨大的题目将极大的减少做题的负担。在赛场上如果发现某题计算量非常大,不妨洗个脸冷静一下,换一个思路可能会豁然开朗。

*请注意,本题如果直接用网上的long long 存点的板子,可能会导致答案错误。因为在计算过程中会出现超过10^9的情况,这样在计算勾股定理的时候再一个平方就会出现爆long long精度的问题。解决办法要么使用__int128或者高精度,要么直接用double存点。 *

代码

my

#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3fint dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};ll ksm(ll a,ll b) {ll ans = 1;for(;b;b>>=1LL) {if(b & 1) ans = ans * a % mod;a = a * a % mod;}return ans;
}ll lowbit(ll x){return -x & x;}const int N = 2e6+10;
//----------------自定义部分----------------
int n;
struct point { double x, y; };
point p1,p2,p3;double get_distance(point p, point A, point B) {point Ap, Ab, Bp;Ap.x = p.x - A.x, Ap.y = p.y - A.y;Ab.x = B.x - A.x, Ab.y = B.y - A.y;Bp.x = p.x - B.x, Bp.y = p.y - B.y;double r = (Ap.x*Ab.x + Ap.y*Ab.y)*1.0 / (Ab.x*Ab.x + Ab.y*Ab.y);if (r <= 0)return sqrt(Ap.x*Ap.x*1.0 + Ap.y*Ap.y);if (r >= 1)return sqrt(Bp.x*Bp.x*1.0+Bp.y*Bp.y);double px = A.x + Ab.x*r;double py = A.y + Ab.y*r;return sqrt((p.x-px)*(p.x-px)+(p.y-py)*(p.y-py));
}double f(point a,point b){return sqrt(pow(a.x-b.x,2.0) + pow(a.y-b.y,2.0));
}int main()
{scanf("%d",&n);scanf("%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y);double ans = f(p1,p2);while(n--){scanf("%lf%lf",&p3.x,&p3.y);point p4 = {p1.x + p3.x,p1.y+p3.y};ans = min(ans,f(p1,p2));ans = min(ans,get_distance(p2,p1,p4));p1 = p4;}printf("%.9lf\n",ans);return 0;
}

标程

#include<bits/stdc++.h>
using namespace std;
struct point{double x,y;point(double x,double y):x(x),y(y){}
};
double dis(point a,point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double ar(point A,point B,point C){ //三点三角形面积double a=dis(B,C),b=dis(A,C),c=dis(A,B);double p=(a+b+c)/2;return sqrt(p*(p-a)*(p-b)*(p-c));
}
int jud(point A,point B,point C){       //判断角ABC是钝角double a=dis(B,C),b=dis(A,C),c=dis(A,B);return b*b>a*a+c*c;
}
double f(point a,point b,point c){  //c点到ab线段的最小距离double d1=dis(a,c),d2=dis(b,c);if(jud(c,a,b)||jud(c,b,a))return min(d1,d2);double s=ar(a,b,c);double d3=2*s/dis(a,b);return min(min(d1,d2),d3);
}
int main(){int n,i,j,k;double x,y,x0,y0;cin>>n;cin>>x0>>y0>>x>>y;point purple(x,y);point red(x0,y0);double res=1e16;for(i=0;i<n;i++){double xt,yt;cin>>xt>>yt;point temp(red.x+xt,red.y+yt);res=min(res,f(red,temp,purple));red=temp;}printf("%.8f",res);
}

雪色光晕(计算几何+暴力)相关推荐

  1. 夕阳明月映照“雪色”敦煌古阳关

    连日来,甘肃敦煌出现降雪天气.位于敦煌城西南70公里的阳关景区也被厚厚的白雪覆盖,夕阳映照,丝路古道更显苍茫辽阔:明月初升,朗照"雪色"大漠.图为明月映照古阳关.(合成图片) 阳关 ...

  2. 【题解】洛谷P1283 平板涂色(搜索+暴力)

    思路 看到n<16 整个坐标<100 肯定想到暴力啊 蒟蒻来一发最简单易懂的题解(因为不会DP哈 首先我们用map数组来存坐标图 注意前面的坐标需要加1 因为输入的是坐标 而我们需要的是格 ...

  3. BZOJ 1199: [HNOI2005]汤姆的游戏 计算几何暴力

    1199: [HNOI2005]汤姆的游戏 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  4. HDU5128The E-pang Palace(计算几何暴力枚举)

    The E-pang Palace 题解:预处理出所有矩形,然后枚举满足情况的两两矩形即可.因为是矩形,所以我们只需要存对角的两个点即可.就是要注意嵌套也是满足的. 代码 #include<bi ...

  5. 2022牛客寒假算法基础集训营6 签到题5题(附基础集训营4-6签到题总结)

    1.I-A+B问题 模拟,类似于高精度,竖式运算 #include<bits/stdc++.h> using namespace std; typedef long long LL; in ...

  6. 舞动的灵魂、这一季的雪、让我为自己感伤时间

    如果你是我眼中的一片雪花,我期待着你变成一颗千年的琥珀.我不敢低头,怕碎了你,碎了我,碎了我们之间千年的梦.雪花纷纷,飘落的是我那无尽的思绪,恍惚间淡去的流年,染上了思念,渲染了这一季的孤单 一场喧嚣 ...

  7. 2022牛客寒假算法基础集训营

    2022牛客寒假算法基础集训营1 C-Baby's first attempt on CPU D-牛牛做数论 已知欧拉函数 ϕ ( x ) \phi(x) ϕ(x)是满足 1 ≤ y ≤ x 1\le ...

  8. LeetCode779 第K个语法符号 python刷题Day5

    779.第K个语法符号 差一点今天就前功尽弃了,瘫在沙发上一时爽,一直瘫着废到老.想想昨天被一道评级为简单的题困住了.虽然我上学上的久,但我学的东西少啊.好了,开正题了,士可以一日不食而不能半日不学. ...

  9. 解读2015年互联网UGC内容发展态势,安全事件频发

    <2015内容安全年报> 阿里移动安全 第一章 2015年内容安全形势 随着互联网业务的迅速发展,互联网上的信息内容带来了爆炸式的增长.由于缺乏对网络活动进行有效监督和管理的措施,致使互联 ...

最新文章

  1. 5000量子比特的商用计算平台发布!D-Wave:这是商业应用的唯一选择
  2. BestCoder Round #80 1002
  3. 进口网友讨论:是什么让你继续支持并持有BCH?
  4. Android内存泄漏问题(一)
  5. 他从小把数学书当小说看,凭借一本书将全世界狠狠甩在身后,被誉为中国的牛顿...
  6. MyBatis映射文件1(增删改、insert获取自增主键值)
  7. ArcGISTiledMapServiceLayer does not support Multi-Layer Caches
  8. window下c语言c s通信,c++ Windows Socket实现最简单的C/S网络通信(TCP)
  9. android jni c调用java,Android JNI中C调用Java方法
  10. pdf转jpg在线转换的方法分享
  11. 怎样把两个表格合并成一个
  12. 十一. MySQL InnoDB 三大特性之 BufferPool
  13. MacBook合盖不休眠
  14. Python进阶(十八)Python3爬虫小试牛刀
  15. 软件测评师教程之软件测试基础
  16. oracle不足位数补零
  17. QQmail安装例子
  18. 【OriginPro使用】FFT绘制信号频谱图
  19. 常用的CSSreset
  20. 联发科6758_联发科p30安兔兔跑分_p30处理器游戏性能评测

热门文章

  1. python plt调整子图间隔
  2. Java_基础(一)
  3. HTML button标签
  4. Hadoop Hive与Hbase关系 整合
  5. 需求文档中容易出的错误
  6. Python学习笔记九:文件I/O
  7. The connection to adb is down, and a severe error has occured
  8. QT中调用shell或外部命令
  9. 【Vegas改编】发布infopath模板到sharepoint2007站点
  10. PIE SDK矢量数据的读取