A_tb的区间问题 牛客小白月赛101

思路

        这道题给定了一个长为n的数组A,让你对数组A进行k次操作:每次删除数组第一个元素或者删除数组最后一个元素,然后求最终得到的数组和的最大值。

        通过上述表达我们可以知道,进行完这一系列操作之后,数组A一定会变成n-k个索引连续的数组B,这个B数组可能会是A的前n-k个,也可能是中间的n-k个,也可是最后n-k个。所以问题就转化成了,A数组中,所有n-k大小的区间中,元素和的最大值是多少。

        所以,不妨用前缀和,先去计算A数组前i个元素之和,然后我们从j = n-k这个初始位置进行遍历,已知遍历到A数组末尾,用sum[j] - sum[j-n+k]来计算每个n-k大小的区间中的数据之和,然后每次都去最大的作为答案即可。

代码

import java.util.Scanner;

/**
 * @ClassName tb的区间问题
 * @Date 2024-09-28 13:59
 * @Author Administrator
 * @Description TODO
 */
public class tb的区间问题 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        int [] a = new int[n + 1];
        for(int i = 1;i < n + 1;i ++) {
            a[i] = sc.nextInt();
        }
        int []sum = new int[n + 1];    // 前缀和
        for(int i = 1;i < n + 1;i ++) {
            sum[i] = sum[i-1] + a[i];
        }
        int ans = 0;
        int length = n - k;
        for(int i = length;i < n + 1;i ++) {
            ans = Math.max(ans,sum[i]-sum[i-length]);
        }
        System.out.println(ans);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值