题目背景
改编自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<bits/stdc++.h>
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<n;i++)
{
int x;
cin>>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<r)
{
int mid=l+r+1>>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<r)
{
int mid=l+r+1>>1;
if(a[mid]<=lim) l=mid;
else r=mid-1;
}
ans=max(ans,i+l);
}
cout<<ans<<endl;
return 0;
}