HDU 5280 Senior's Array 最大区间和

题意:给定n个数。要求必须将当中某个数改为P,求修改后最大的区间和能够为多少。

水题。枚举每一个区间。假设该区间不改动(即改动该区间以外的数),则就为该区间和,若该区间要改动,由于必须改动,所以肯定是把最小的数改动为P能保证该区间最后和最大,所以比較两种方案的较大者。对于每一个区间取出的较大者,再取总共的最大者就可以。注意一个trick,枚举到整个区间的时候,是必需要改动一个数的。所以这个最大的这个区间仅仅有一种方案。

先预处理1~i的区间和,维护每一个区间的最小值和区间和。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
using namespace std;

const int MAX = 1005;
const int INF = 1e9;

int n;
__int64 P, a[MAX];
__int64 sum[MAX], smallest[MAX][MAX];

void input()
{
    scanf("%d%I64d", &n, &P);
    for(int i = 1; i <= n; i++)
        scanf("%I64d", &a[i]);
}

void solve()
{
    smallest[0][0] = INF;
    sum[0] = 0;
    __int64 ans = P;
    for(int i = 1; i <= n; i++)
        sum[i] = sum[i - 1] + a[i];
    for(int i = 1; i <= n; i++)
    {
        smallest[i][i] = a[i];
        ans = max(ans, a[i]);
        for(int j = i + 1; j <= n; j++)
        {
            smallest[i][j] = min(smallest[i][j - 1], a[j]);
            ans = max(ans, sum[j] - sum[i - 1] - smallest[i][j] + P);
            if(i != 1 || j != n)
                ans = max(ans, sum[j] - sum[i - 1]);
        }
    }
    printf("%I64d\n", ans);
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        input();
        solve();
    }
    return 0;
}

HDU 5280 Senior's Array 最大区间和

时间: 2024-10-18 03:35:55

HDU 5280 Senior&#39;s Array 最大区间和的相关文章

HDU 5280 Senior&#39;s Array 最大区间和

题意:给定n个数,要求必须将其中某个数改为P,求改动后最大的区间和可以为多少. 水题.枚举每个区间,如果该区间不修改(即修改该区间以外的数),则就为该区间和,若该区间要修改,因为必须修改,所以肯定是把最小的数修改为P能保证该区间最后和最大,所以比较两种方案的较大者.对于每个区间取出的较大者,再取总共的最大者即可.注意一个trick,枚举到整个区间的时候,是必须要修改一个数的,所以这个最大的这个区间只有一种方案.先预处理1~i的区间和,维护每个区间的最小值和区间和. #include <iostr

hdu 5280 Senior&#39;s Array

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5280 Senior's Array Description One day, Xuejiejie gets an array $A$. Among all non-empty intervals of $A$, she wants to find the most beautiful one. She defines the beauty as the sum of the interval. Th

hdu 5280 Senior&#39;s Array(最大子段和)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5280 题意:将一个长度为n的数组,将里面某一个数改为p,使改变后最大子段和最大. 题解:dp[i]=max(dp[i-1)+a[i],a[i]),表示以第 i 个数结束的最大子段和,时间复杂度为O(n). 1)由于n<=1000,可以暴力解决,将每一个数都依次改为p,求出最大的子段和,再去这些最大子段和中最大的,时间复杂度为O(n*n); #include <iostream> #inclu

HDU 5280 Senior&#39;s Array (暴力,水)

题意:给一个数列,再给一个数字p,要求p一定要替换掉数列中的一个元素,然后求最大连续子序列之和. 思路:1000*1000的复杂度,O(n*n) .就是每个都试,然后求和. 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define pii pair<int,int> 4 #define INF 0x7f7f7f7f 5 using namespace std; 6 const int N=2000; 7 int a[N]

[最大子序列和]Hdu 5280 Senior&#39;s Array

题意:一个序列,在其中一个数必须替换成给定数字p的条件下,求最大连续子序列之和. 依次把每一个数替换成p,求每次的最大连续和,找出最大值.O(n^2). #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> typedef long long ll; using namespace std; const int MAXN=1000+5; const int

HDU 5281 Senior&amp;#39;s Gun 杀怪

题意:给出n把枪和m个怪.每把枪有一个攻击力,每一个怪有一个防御力.假设某把枪的攻击力不小于某个怪的防御力则能将怪秒杀,否则无法杀死.一把枪最多仅仅能杀一个怪,不能用多把枪杀同一个怪.每杀一次怪能够得到枪的攻击力减去怪的防御力的的分数. 求得分的最大值. 贪心.首先我们考虑这样一种情况:用攻击力为A的枪杀防御力为a的怪,攻击力为B的枪杀防御力为b的怪.则得分为A - a + B - b. 最好还是设A ≤ B,则有a ≤ A ≤ B.b ≤ B.假设有A < b,那么我们考虑用B杀a.而不使用A

HDU 5280 BestCoder Round #47 1001:Senior&#39;s Array

Senior's Array Accepts: 199 Submissions: 944 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 某天学姐姐得到了一个数组A,在这个数组的所有非空区间中,她找出了一个区间和最大的,并把这个区间和定义为这个数组的美丽值. 但是她觉得这个数组不够美,于是决定修理一下这个数组. 学姐姐将会进行一次操作,把原数组中的某个数修改为P(必须修改)

HDU #5283 Senior&#39;s Fish

题目描述: 平面上有一些鱼,初始时鱼会在一些位置,某些时刻编号在一段区间内的鱼会同时向x轴正方向,或y轴正方向平移一定距离,某些时刻会询问一个矩形内鱼的数量. 解题思路: 显然地,求一个矩形内的鱼可以用矩形四个顶点为右上角的整个左下矩形加加减减.那么问题就转化为一个顶点左下角矩形内鱼的数量.注意到鱼只会向右和向上的话,那就很好做.维护两颗线段树,分别维护编号在l~r的鱼的x坐标最大值.y坐标最大值.每次修改对应区间加.每次如果区间最大值大于限制,那就找出最大值的位置,赋为-inf,同时在树状数组

hdu 5281 Senior&#39;s Gun

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5281 Senior's Gun Description Xuejiejie is a beautiful and charming sharpshooter. She often carries $n$ guns, and every gun has an attack power $a[i]$. One day, Xuejiejie goes outside and comes across $m