题目链接:https://vjudge.net/problem/Gym-102569B
题意:数轴上有N个点,从0出发最多走t步问最多经过几个点。
思路:分开存负数点和整数点,然后枚举每个端点,某个点的距离*2+往反方向走距离<t。利用upper_bound()查找位置即可。(例如枚举左端点时,找出往右走最多的点)
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 vector <ll> f,z; 5 int main() 6 { 7 ll n,t; 8 scanf("%lld%lld",&n,&t); 9 for(int i=0;i<n;i++) 10 { 11 ll x; 12 scanf("%lld",&x); 13 if(x>0) z.push_back(x); 14 else f.push_back(-x); 15 } 16 sort(f.begin(),f.end()); 17 sort(z.begin(),z.end()); 18 ll ans=0; 19 for(int i=0;i<f.size();i++) 20 { 21 if(f[i]>t) break; 22 ll maxd=t-2*f[i]; 23 ll res=0; 24 if(maxd>0) res=upper_bound(z.begin(),z.end(),maxd)-z.begin(); 25 ans=max(ans,res+i+1); 26 } 27 for(int i=0;i<z.size();i++) 28 { 29 if(z[i]>t) break; 30 ll maxd=t-2*z[i]; 31 ll res=0; 32 if(maxd>0) res=upper_bound(f.begin(),f.end(),maxd)-f.begin(); 33 ans=max(ans,res+i+1); 34 } 35 printf("%lld ",ans); 36 return 0; 37 }