UVA1615 Highway
题目链接
这道题不算难,就是一道贪心题,下面介绍两种方法。
第一种方法 主要的思路就是在x轴上向右选取距离当前点的长度为D的点,即最靠右的点,这样选可以尽可能的满足后面的点。
选点前先将每个点从左向右排序,横坐标相同则从上往下排,这里注意要把纵坐标小的放在后面,因为纵坐标小所选取的点更靠右,如果把纵坐标小的放在前面那么下一个纵坐标大的点距离这个点一定大于D不满足,会多选一个点。(这里表达不太清楚,可以自己画个图看一下)
第二种方法 主要的思路就是区间选点,每个点在x轴上都有一个选点的区间,我们把这N个区间选取出来,然后选取最少的点保证每个区间都有点即可。
AC代码方法一
#include
#include
#include
using namespace std;
const int MAXN = 1e5;
int L, D;
struct point
{
int x;
int y;
point(int a = 0, int b = 0)
{
x = a;
y = b;
}
};
point points[MAXN];
double getp(int a, int b)//在x轴上向右找到距离(a,b)小于等于L的最远的点
{
double x = sqrt(pow(D, 2) - pow(b, 2)) + a;//距离等于L的点
if (x >L)
return L;
return x;
}
bool judge(point p, int x)//判断p点距离(x,0)是否小于D
{
int a = p.x;
int b = p.y;
double dis =pow(x - a, 2) + pow(b, 2);
if (dis b.y;
return a.x > L)
{
cin >> D;
int N;
cin >> N;
int cnt = 0;
double x;
for (int i = 0; i > points[i].x >> points[i].y;
}
sort(points, points + N, cmp);
cnt++;
x = getp(points[0].x, points[0].y);
for (int i = 0; i b;
double r = a + sqrt(pow(D, 2) - pow(b, 2));//右端点
double l = a - sqrt(pow(D, 2) - pow(b, 2));//左端点
qujian[i].l = l;
qujian[i].r = r;
}
sort(qujian, qujian + N, cmp);
cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?