P2390 地标访问

题目背景

改编自USACO2007Nov铜组Exploration

题目描述

贝西在一条道路上旅行,道路上有许多地标,贝西想要在日落之前访问尽可能多的路标。将道路视为一条数轴,贝西从原点出发,道路上有n(1<=n<=50000)个地标,每个地标有一个坐标x[i](-100,000 ≤ xi ≤ 100,000)且地标的坐标各不相同,t(1≤ T ≤1000000000)分钟之后将会日落。

输入格式

第一行:两个整数t,n

第二行至第n+1行:地标的坐标x[i]

输出格式

一个整数,贝西能访问的最多的地标数

输入输出样例

输入 #1复制

25 14
16
8
-7
3
10
-15
-17
6
-12
14
-13
2
9
-5

输出 #1复制

8

说明/提示

1、贝西日落时不用回到原点。

2、与原模拟水题不同。

3、数据较原题有所修改

题目分析:这个题其实把时间分为两个部分就可以了,然后最后的结果为左右能够走到的最多的点。

#include
using namespace std;
const int N=50010;
int a[N],b[N];
int main()
{
	int t,n;
	int lc=0,rc=0;
	cin>>t>>n;
	for(int i=0;i>x;
		if(x<0) //左边的点 
			a[++lc]=-x; 
		else b[++rc]=x; //右边的点 
	}
	sort(a+1,a+lc+1);
	sort(b+1,b+rc+1);
	int ans=0;
	for(int i=0;i<=lc;i++)//往左走,往右走 
	{
		int lim=t-2*a[i];
		if(lim<0) break;
		int l=0,r=rc;
		while(l>1;
			if(b[mid]<=lim) l=mid;
			else r=mid-1;
		}
		ans=max(ans,i+l);
	}
	for(int i=0;i<=rc;i++) //往右走,往左走 
	{
		int lim=t-2*b[i];
		if(lim<0) break;
		int l=0,r=lc;
		while(l>1;
			if(a[mid]<=lim) l=mid;
			else r=mid-1;
		}
		ans=max(ans,i+l);
	}
	cout<

 

你可能感兴趣的:(算法,noip)