【CF-1358 D. The Best Vacation】 贪心

D. The Best Vacation

题意

某个地方,一年有(n)个月,第(i)月有(a_i)天,现在要选择一个长度为x的假期,

如果某天是某月的第(i)天,那么他的价值就是(i),求价值最大的假期。

题解

假期的最后一天一定是某个月的结尾,直接枚举。

PS:

我想的是假期的第一天或者最后一天一定是某个月的结尾,写的麻烦了。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
typedef unsigned long long ull;

ll arr[N*2],pre[N*2],val[N*2];
int main()
{
    int n;
    ll x;
    scanf("%d%lld",&n,&x);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&arr[i]);
        arr[i+n]=arr[i];
    }
    for(int i=1;i<=2*n;i++)
    {
        pre[i]=pre[i-1]+arr[i];
        val[i]=val[i-1]+(arr[i]+1)*arr[i]/2;
    }
    ll ans=0;
    for(int l=1,i=1+n;i<=2*n;i++)
    {
        while(pre[i]-pre[l]>x) l++;
        ll now=val[i]-val[l];
        ll rel=x-pre[i]+pre[l];
        now+=(arr[l]+arr[l]-rel+1)*rel/2;
        ans=max(ans,now);
    }
    printf("%lld
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/valk3/p/12978849.html