UVALive 3835:Highway(贪心 Grade D)
2014-09-29 14:52
239 查看
VJ题目链接
题意:平面上有n个点,在x轴上放一些点,使得平面上所有点都能找到某个x轴上的点,使得他们的距离小于d。求最少放几个点。
思路:以点为中心作半径为d的圆,交x轴为一个线段。问题转换成用最少的店覆盖所有的线段。经典贪心。按右点从小到大排序,然后从左往右扫,每次选择区间右点就行了。
代码:
题意:平面上有n个点,在x轴上放一些点,使得平面上所有点都能找到某个x轴上的点,使得他们的距离小于d。求最少放几个点。
思路:以点为中心作半径为d的圆,交x轴为一个线段。问题转换成用最少的店覆盖所有的线段。经典贪心。按右点从小到大排序,然后从左往右扫,每次选择区间右点就行了。
代码:
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 100100 bool eqs(double a, double b) { return fabs(a-b) < 1e-5; } struct Seg{ double l, r; void get(int d) { int x, y; scanf("%d%d", &x, &y); double dx = sqrt(d*d-y*y+0.0); l = x - dx; r = x + dx; } bool operator < (const Seg &b) const { if (!eqs(r,b.r)) return r < b.r; return l < b.l; } }seg ; int main(){ int l; while (scanf("%d", &l) != EOF) { int d; scanf("%d", &d); int n; scanf("%d", &n); for (int i = 0; i < n; i++) { seg[i].get(d); } sort(seg, seg+n); int cnt = 0; double now = -0x3f3f3f3f; for (int i = 0; i < n; i++) { if (now < seg[i].l) { now = seg[i].r; cnt++; } } printf("%d\n", cnt); } return 0; }
相关文章推荐
- Cross the Wall UVALive - 5097 (贪心+斜率dp)
- UVALive - 7464 Robots 贪心+递归
- UVAlive 2322 Wooden Sticks(贪心)
- uvalive 3971 - Assemble(二分搜索 + 贪心)
- UVALive 2326 Moving Tables 贪心
- UVALive 3971 Assemble 电脑配件 二分+贪心
- uvalive 3635(贪心)
- UVALive 7146 (贪心+少许数据结构基础)2014acm/icpc区域赛上海站
- UVALive 4863 Balloons 贪心/费用流
- UVALive 3664 Guess(贪心+精度)
- 贪心 UVALive 6832 Bit String Reordering
- Cross the Wall UVALive - 5097 (贪心+斜率dp)
- UVA 12124 UVAlive 3971 Assemble(二分 + 贪心)
- UVALIVE 5000 Underwater Snipers(二分+贪心)
- UVALive - 4987 Evacuation Plan DP+贪心
- UVaLive 6588 && Gym 100299I (贪心+构造)
- UVAlive 2326 Moving Tables(贪心 + 区间问题)
- uvalive 4328(贪心)
- UVALive 3971 Assemble(二分 + 贪心)
- UVALive 4867 Maximum Square 贪心