5.7
洛谷P2390 地标访问
访问的地标越多,走得就越久(远)。
所以可以二分答案。
check函数枚举了端点来模拟运动区间,可以分为两大类:
一个方向走到底 和 折返一次走,分别判断就好了。
当然折返时最多折返一次,不然就是浪费时间,得不到最优解。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int t,n,q[50010];
bool check(int x){ //判断函数,表示的是能否访问到x个路标
for(int r=x;r<=n;r++){ //枚举能到达的右端点
int l=r-x+1; //推出出发的左端点
if(q[l]>=0||q[r]<=0) //当只往右走或左走时
if(x<=t) return true;
if(q[l]<0&&q[r]>0) //当需要往返时
if(min(-q[l],q[r])+x<=t)//要先走到更近的一边
return true;
}
return false;
}
int main()
{
cin>>t>>n;
for(int i=1;i<=n;i++)
cin>>q[i];
sort(q+1,q+n+1);
int l=-1,r=n+1;
while(l+1<r){
int mid=(l+r)/2;
if(check(mid))
l=mid;
else
r=mid;
}
cout<<l;
return 0;
}