A - A Multiply

纯粹的發表於2024-03-24

原題連結

題解

1.選擇一個區間,然後加上其和的 \(c-1\) 倍,所以我們要選中區間和最大的那個
2.然而由於倍數可能為負,即 \(c<=0\) ,所以這時我們要儘可能選和小的
3.由於最多選一次,意味著也可以不選,所以dp的時候不選就可以賦零

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
    ll n,c;
    cin>>n>>c;

    if(c>0)//選0意味著減少,所以要儘可能選小的減少
    {
        ll sum=0,maxs=0,ans=0;
        for(ll i=1;i<=n;i++)
        {
            ll x;
            cin>>x;
            if(sum+x<=0) sum=0;
            else sum+=x;
            maxs=max(maxs,sum);
            ans+=x;
        }
        cout<<ans+maxs*(c-1);
    }
    else
    {
        ll sum=0,mins=0,ans=0;
        for(ll i=1;i<=n;i++)
        {
            ll x;
            cin>>x;
            if(sum+x>=0) sum=0;
            else sum+=x;
            mins=min(mins,sum);
            ans+=x;
        }
        cout<<ans+mins*(c-1);
    }

    return 0;
}