Bonuses on a Line Gym

题目链接: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 }
原文地址:https://www.cnblogs.com/zpj61/p/13614699.html