题目描述
输入n个数,围成一圈,求连续m(m<n)个数的和最大为多少?
输入
输入的第一行包含两个整数n, m。第二行,共n个整数。
输出
输出1行,包含一个整数,连续m个数之和的最大值。
样例输入
10 3
9 10 1 5 9 3 2 6 7 4
样例输出
23
思路:主要三种方法,向前加,和向后加,和连接方法,向前加我叫做前缀方法,向后加称为滑动窗口方法。
滑动窗口方法:向后滑动超过最大长度取模,例如样例输入中4 ,9,10下标为9 ,0 ,10就是9mod10,10mod10,11mod10的结果
前缀方法:取模时需要加最大下标例如样例输出中9 ,4,7下标为0,9,8就是(0+10)mod10,(-1+10)mod10,(-2+10)mod10的结果
连接方法:直接将最前的数据和最后的数据连接起来,创建n+m-1个空间的数组,把前m个数放到最后,例如本样例输入中,创建一个10+3-1=12长度大小的数组,将9,10放到最后,直接计算连续的m个的和。(ps:简单易懂好理解,但数据较多时空间开销大)
代码实现
滑动窗口方法
import java.util.Scanner;
/**
* 题目 2251: [蓝桥杯][算法提高]数组求和
*/
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int m=scan.nextInt();
int arr[]=new int[n];
for (int i = 0; i < n; i++) {
arr[i]=scan.nextInt();
}
f1(n, m, arr)