首页 > 其他 > 详细

Yet Another Yet Another Task

时间:2020-05-30 19:42:53      阅读:54      评论:0      收藏:0      [点我收藏+]

题意:

长度为 \(n\) 的数组,可以选取一段连续区间去掉其中的一个最大值求和,问求和的最大值为多少。
\(-30\leq a[i]\leq 30\)
传送门

分析:

一开始考虑问题的时候, 想得比较偏,一直把重点放在如何找出区间上。
正解:
枚举区间的最大值,求和,必然可以求出答案。
技术分享图片
请注意,如果最大总和段上的值等于 mx,则可以忽略这一事实。如果没有,您将使用比实际值小的值更新答案。令最大和段上的实际最大值为 y。
您可以看到,对于 y 和 mx 之间的任何值,最大总和段将始终是所选的那个。因此,当您达到 y 时,将使用正确的值更新答案。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int inf=0x3f3f3f3f;
int a[N];
int main()
{
    int n,ans=-inf;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=-30;i<=30;i++)
    {
        int sum=0;
        for(int j=1;j<=n;j++)
        {
            if(a[j]<=i)
            {
                sum=max(0,sum)+a[j];
                ans=max(ans,sum-i);
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}

Yet Another Yet Another Task

原文:https://www.cnblogs.com/1024-xzx/p/12993913.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!