牛客国庆集训派对Day1 New Game!+计算几何
题目链接:https://www.nowcoder.com/acm/contest/201/L
题目大意:给你n个圆和两条直线,在圆上,和圆内和直线上行走不消耗体力。
在其他位置上由S点走到T点消耗的体力为S和T的欧几里得距离。Hifumi Takimoto想从 L1 出发,走到 L2 。请计算最少需要多少体力。
思路:因为圆与直线的位置可以任意。从L1到L2,我们计算从c大的直线的到c小的直线距离就好了,如图L1->L2。
其实思路就是dp最短路。我们先按照圆与L1的距离排序。(排序依据不只是距离,因为可能在直线外)
int px(O pa, O pb)
{if(a*pa.x+b*pa.y+c1<0&&a*pb.x+b*pb.y+c1<0)//都在L1左边,按照距离L1的距离从大到小return pa.s<pb.s;else if(a*pa.x+b*pa.y+c1>0&&a*pb.x+b*pb.y+c1>0)//都在L1右边,按照距离L1的距离从小到大return pa.s>pb.s;elsereturn a*pa.x+b*pa.y+c1<a*pb.x+b*pb.y+c1?0:1;//一左一右,左在右前
}
所以递推公式(dp[i].s为初始到L1的距离)
dp[i].s=min(dp[j].s,d[i].s), j<i。
因为n<=1000;直接两种循环暴力。
先初始化s[i].s=d。
for(int i=0;i<n;i++)
{for(int j=i+1;j<n;j++){//d(ij)如图的黄色虚线距离。dp[j].s=(dp[i].s, d(ij));}
}
这样求出所有圆到L1的距离,在加上该圆的到L2的距离。
再求dp[i].s的最小距离就行了。
思考:这题当时写了两个小时,因为犯了不少错误。最后AC的瞬间,高兴跳起来的欢呼。这可能就是ACM的魅力吧!。
#include<bits/stdc++.h>
using namespace std;struct O
{double x;double y;double r;double s;
};
O w[1005];
long long n, a, b, c1, c2;int px(O pa, O pb)
{if(a*pa.x+b*pa.y+c1<0&&a*pb.x+b*pb.y+c1<0)return pa.s<pb.s;else if(a*pa.x+b*pa.y+c1>0&&a*pb.x+b*pb.y+c1>0)return pa.s>pb.s;elsereturn a*pa.x+b*pa.y+c1<a*pb.x+b*pb.y+c1?0:1;
}
int px1(O pa, O pb)
{return pa.s<pb.s;
}
int main()
{scanf("%lld%lld%lld%lld%lld",&n, &a, &b, &c1, &c2);for(int i=0;i<n;i++){scanf("%lf%lf%lf",&w[i].x, &w[i].y, &w[i].r);};if(c1>c2)swap(c1, c2);for(int i=0;i<n;i++)//初始化{double fz=fabs(a*w[i].x+b*w[i].y+c1);double fm=sqrt(a*a+b*b);double f1=fz/fm;if(f1<=w[i].r)w[i].s=0;elsew[i].s=f1-w[i].r;}sort(w,w+n, px);//圆的排序for(int i=0;i<n;i++)//dp递推{for(int j=i+1;j<n;j++){double s1=sqrt((w[i].x-w[j].x)*(w[i].x-w[j].x)+(w[i].y-w[j].y)*(w[i].y-w[j].y));double s2=w[i].r+w[j].r;if(s1>s2)w[j].s=min(w[i].s+s1-s2, w[j].s);elsew[j].s=min(w[i].s, w[j].s);}}for(int i=0;i<n;i++)//加上到L2的距离{double fz=fabs(a*w[i].x+b*w[i].y+c2);double fm=sqrt(a*a+b*b);double f1=fz/fm;if(f1<=w[i].r)w[i].s+=0;elsew[i].s+=f1-w[i].r;}sort(w,w+n, px1);//按s从小到大排序printf("%.6f\n",w[0].s);return 0;
}
牛客国庆集训派对Day1 New Game!+计算几何相关推荐
- 2020牛客国庆集训派对day1 A.ABB
2020牛客国庆集训派对day1 A.ABB 题目链接 题目描述 Fernando was hired by the University of Waterloo to finish a develo ...
- (花里胡哨)New Game!(牛客国庆集训派对Day1)
链接:https://ac.nowcoder.com/acm/contest/201/L 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言209 ...
- 牛客国庆集训派对Day1 C-Utawarerumono(扩展欧几里得)
链接:https://www.nowcoder.com/acm/contest/201/C 来源:牛客网 算术是为数不多的会让Kuon感到棘手的事情.通常她会找Haku帮忙,但是Haku已经被她派去买 ...
- 牛客国庆集训派对Day1 J-Princess Principal (区间查询是否是正确的括号匹配)
链接:https://www.nowcoder.com/acm/contest/201/J 来源:牛客网 阿尔比恩王国(the Albion Kingdom)潜伏着一群代号"白鸽队(Team ...
- 2020牛客国庆集训派对day1 Zeldain Garden
Zeldain Garden 题意: 问[L,R]内所有数的因子的数量和 题解: 如果传统暴力做肯定不行 我们来找找规律: 数字: 因子数目 1~n的因子数和 1 1 1 2 2 3=2+1/ 3 2 ...
- 2020牛客国庆集训派对day1 C. Bob in Wonderland
Bob in Wonderland 题意: 一棵树,问最少移动多少次边可以使其变成一个链? 移动是指:从原位置拆下并连到新位置,这样算一次 题解: 错误思路 我一开始在想既然求最少移动次数,那我们就尽 ...
- ABB (2020牛客国庆集训派对day1)
ABB 题意: 长度为n的字符串,问最少添加多少字符可以使其构成回文字符串 题解: 最长回文字符串我的第一反应是manacher马拉车算法,那我们直接马拉车找到已有最长回文串,然后总长度减去不就是答案 ...
- 牛客国庆集训派对Day1: K. Tengen Toppa Gurren Lagann(贪心)
K. Tengen Toppa Gurren Lagann 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097152K 64bit IO Format: ...
- 2021牛客国庆集训派对day1 H - Longest Path
Description 给你一棵树,边有边权, 定义一条从u到v的路径,这一路上经过的点为e1,e2,...,eke_1,e_2,...,e_ke1,e2,...,ek 定义这条路径的权值f(u ...
最新文章
- 纪念逝去的头发--一次debug经历
- 【数据展示】matplotlib.pyplot.plot()探究
- Java的表白程序_java表白程序
- 监控软件nagios之安装
- 得到app文稿导出_再见了扫描仪!微信打开这个功能,一键将纸质文稿扫描成电子档...
- Markdown_LaTex_极限符号
- sqlserver 分组合并列_哪个“三人组”是历史最强组合?数据显示最均衡组合令人意外...
- ArcGIS线转面的方法
- 创建一个简单的数据库
- fpgrowth算法实战 mlib_MLlib--FPGrowth算法
- 软件定义网络带来新的自动化优势和挑战
- IDEA 社区版 常用插件列表
- 岁月温柔-10 妈妈的执念--不肯开空调,坚持使用油汀
- 爬虫关键信息获取与MongoDB数据库使用方法
- Windows 10打开远程桌面的方法
- 共享充电服务迭代背后,怪兽充电们走出“围城之困”?
- 安卓高通Diag命令解析
- 构建嵌入式系统软件开发环境-VMware的安装及搭建嵌入式Linux开发环境
- 迅为4412开发板(全能版)V_4.0 ubuntu 在Android4.4.4的内核下移植wifi
- Camlytics:智能摄像头监控软件