您当前的位置: 首页 > 

PolarDay.

暂无认证

  • 0浏览

    0关注

    144博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

UVA1615 Highway

PolarDay. 发布时间:2021-05-09 12:33:39 ,浏览量:0

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            
关注
打赏
1659342973
查看更多评论
0.0377s