SDUT 2021 Spring Individual Contest(for 20) - 11 补题

B题Bonuses on a Line
思路:四种情况:只往左走,只往右走,先向右走再向左走,先向左走再向右走。枚举每种情况的最大值,还要判断0处是否有,如果有最大值+1,如果没有,输出最大值

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
ll pos[N];
ll neg[N];
ll p1=0;
ll p2=0;
int main()
{
    
    
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    ll n,t;
    cin>>n>>t;
    ll flag=0;
    for(int i=1;i<=n;i++)
    {
    
    
        ll x;
        cin>>x;
        if(x<0)
        neg[++p1]=-x;
        else if(x>0)
        pos[++p2]=x;
        else
        flag=1;
    }
    sort(neg+1,neg+1+p1);
    ll ans=0;
    ll cur=0;
    for(int i=1;i<=p1;i++)
    {
    
    
        if(neg[i]>t)
        break;
        cur++;
    }
    ans=max(ans,cur);
    cur=0;
    for(int i=1;i<=p2;i++)
    {
    
    
        if(pos[i]>t)
        break;
        cur++;
    }
    ans=max(ans,cur);
    for(int i=1;i<=p1;i++)
    {
    
    
        ll left=t-neg[i]*2;
        if(left<0)
        break;
        ll idx=upper_bound(pos+1,pos+1+p2,left)-pos;
        idx--;
        cur=idx+i;
        ans=max(cur,ans);
    }
    for(int i=1;i<=p2;i++)
    {
    
    
        ll left=t-pos[i]*2;
        if(left<0)
        break;
        ll idx=upper_bound(neg+1,neg+1+p1,left)-neg;
        idx--;
        cur=idx+i;
        ans=max(cur,ans);
    }
    cout<<ans+flag<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_51768569/article/details/115358927