2020.12.26框子求循环数组的m个最大和

该博客介绍了一种算法问题,即如何在给定的循环数组中找到连续m个数的最大和。通过移动一个固定大小为m的窗口来遍历数组,不断更新最大和。提供的代码示例展示了如何实现这一过程。

2020.12.26框子求循环数组的m个最大和

题目描述

输入n个数,围成一圈,求连续m(m<n)个数的和最大为多少?

输入格式

输入的第一行包含两个整数n, m。第二行,共n个整数

输出格式

输出1行,包含一个整数,连续m个数之和的最大值。

样例输入

10 3
9 10 1 5 9 3 2 6 7 4

样例输出

23

数据规模和约定

0<m<n<1000, -32768<=输入的每个数<=32767。

思路

将n个数排成一列,通过一个长度为m的框子围住m个数字,每次前进一个就将框子中的数据出框,进入新的数字。一直到n个数字的末尾后在遍历框子中的数字。代码如下(其中运用了循环数组,提高性能)

代码

    class TestPaLou{
        int n,k,s,j,t,max;
        int[]a;
        int[] b;
        void test() {
            Scanner input = new Scanner(System.in);
            n = input.nextInt(); k = input.nextInt();
            s = 0; a= new int[k];b = new int[k];
            for(int i = 0; i < k; i++) {
                a[i] = input.nextInt();
                b[i] = a[i];
                s+=a[i];
            }
            j = 0;max = s;
            for(int i = k; i < n; i++) {  //s = s + t- x ,x要持续更新
                //j指向x的下标,j = j % k
                t = input.nextInt();
                s = s + t - a[j % k];
                a[j % k] = t;
                j++;
                if(max < s) max = s;
            }
            for(int i = 0; i < k; i++) {
                t = b[i];
                s = s + t - a[j % k];
                a[j % k] = t;
                j++;
                if(max < s) max = s;
            }
            System.out.println(max);
        }
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值