UVA1615 Highway

UVA1615 Highway

题目链接

这道题不算难,就是一道贪心题,下面介绍两种方法。

第一种方法
主要的思路就是在x轴上向右选取距离当前点的长度为D的点,即最靠右的点,这样选可以尽可能的满足后面的点。

选点前先将每个点从左向右排序,横坐标相同则从上往下排,这里注意要把纵坐标小的放在后面,因为纵坐标小所选取的点更靠右,如果把纵坐标小的放在前面那么下一个纵坐标大的点距离这个点一定大于D不满足,会多选一个点。(这里表达不太清楚,可以自己画个图看一下)

第二种方法
主要的思路就是区间选点,每个点在x轴上都有一个选点的区间,我们把这N个区间选取出来,然后选取最少的点保证每个区间都有点即可。

AC代码

方法一

#include<iostream>
#include<algorithm>
#include<cmath>
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 <= pow(D, 2))
		return true;
	return false;
}
bool cmp(point a, point b)
{
	if (a.x == b.x)
		return a.y > b.y;
	return a.x < b.x;
}
int main()
{
	while (cin >> L)
	{
		cin >> D;
		int N;
		cin >> N;
		int cnt = 0;
		double x;
		for (int i = 0; i < N; i++)
		{
			cin >> 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 < N; i++)
		{
			if (judge(points[i], x))
				continue;
			else
			{
				x = getp(points[i].x, points[i].y);
				cnt++;
			}
		}
		cout << cnt << endl;
	}
	return 0;
}

方法二

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 1e5;
int L, D;
struct qu
{
	double l;
	double r;
	qu(double x=0, double y=0)
	{
		l = x;
		r = y;
	}
};
qu qujian[MAXN];
bool cmp(qu a, qu b)
{
	if (a.l == b.l)
		return a.r < b.r;
	return a.l < b.l;
}
int xuandian(int n)
{
	int cnt = 1;
	double r = qujian[0].r;
	for (int i = 0; i < n; i++)
	{
		if (qujian[i].l <= r)
			continue;
		else
		{
			r = qujian[i].r;
			cnt++;
		}
	}
	return cnt;
}
int main()
{
	while (cin >> L)
	{
		memset(qujian, 0, sizeof(qujian));
		int a, b, N;
		cin >> D >> N;
		for (int i = 0; i < N; i++)
		{
			cin >> a >> 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<<xuandian(N)<<endl;
	}
	return 0;
}

highway_env是一个用于创建和测试自动驾驶智能体的Python库。它旨在提供一个可扩展的环境,用于开发和评估各种自动驾驶算法。 highway_env提供了一个高速公路环境,其中包括多车道、交通流量、车辆状态和路标等元素。该库提供了一些基本的环境配置选项,例如车道宽度、车辆速度、车辆密度等,以帮助用户创建符合实际情况的测试场景。 在使用highway_env进行自动驾驶智能体开发时,用户可以通过编程和配置文件来设置环境参数,例如目标速度、道路长度、交通流量分布等。智能体可以通过接受环境状态和奖励信号来决定自己的行动,并通过交互与环境进行学习和优化。 高速公路环境中的多车道和交通流量使得智能体需要学习适应不同的交通状况,并在保持安全的同时尽可能快地到达目的地。因此,highway_env非常适合用于测试各种自动驾驶技术的性能和鲁棒性。 此外,highway_env还提供了一系列实用的函数和方法来帮助用户进行环境和智能体参数的配置、数据记录、可视化等。这些功能大大简化了自动驾驶算法的开发和调试过程,提高了开发效率。 总之,highway_env是一个功能强大的Python库,可以提供可扩展的高速公路环境,用于开发和评估自动驾驶智能体。通过使用highway_env,用户可以方便地创建各种测试场景,并进行自动驾驶算法的开发和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值