【贪心】Highway
[UVa1615]Highway
算法竞赛入门经典第8章8-11(P255)
题目大意:给定平面上N个点和D,要求在x轴上选出一些点,每个给定的点至少与一个选出的点欧几里得距离<=D
试题分析:对于每个点,我们只需要以其为圆心做半径为D的圆,求其与x轴的两个交点,确定这个点的一条线段,然后进行线段覆盖形贪心即可。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> #define LL long long using namespace std; inline int read(){ int x=0,f=1; char c= getchar (); for (;! isdigit (c);c= getchar ()) if (c== '-' ) f=-1; for (; isdigit (c);c= getchar ()) x=x*10+c- '0' ; return x*f; } const int INF = 999999; const int MAXN = 100001; int L,D; int N; struct data{ int x,y; double lx,ly; }a[MAXN+1]; bool cmp(data a,data b){ return a.ly<b.ly; } int main(){ while ( scanf ( "%d%d" ,&L,&D)!=EOF){ N=read(); for ( int i=1;i<=N;i++){ a[i].x=read(),a[i].y=read(); a[i].lx=( double )a[i].x- sqrt (( double )D*( double )D-( double )a[i].y*( double )a[i].y); a[i].ly=( double )a[i].x+ sqrt (( double )D*( double )D-( double )a[i].y*( double )a[i].y); a[i].lx=max(a[i].lx,0.0); a[i].ly=min(a[i].ly,( double )L); } sort(a+1,a+N+1,cmp); int tmp=-1,ans=0; for ( int i=1;i<=N;i++){ if (tmp<a[i].lx){ tmp=a[i].ly; ans++; } } printf ( "%d\n" ,ans); } } |
你——悟到了么?
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)