资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
输入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。
分析如下:
首先根据题意,我们可以用一个整形的array数组来存储输入的一串数字,再另外构造一个函数,在主函数中通过调用外部函数来解决这个问题。
solve(int[]num , int m)函数里面就先判断数组元素是否为空或者数组长度是否为空,如果为空那就直接返回0,如果不为空,那么我们就继续下面·的代码。定义一个求和变量sum来求数组中连续m个元素的和。然后把这个sum的值赋值给max变量,先求没有围成一圈(也就是直接直接输入的一条数据n个数字连续m个数和的最大值,然后再在num[len - m +1]之后的m个数字必然会需要重新回到起点,这个时候我们就需要重新写一个for循环来把sum里面的num[len - m]个数减掉,同时加上num[0]这样子就可以得到想要的结果了,如果max小于这个数那就将这个数赋值给max,否则就直接返回max。
代码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); int []array = new int[n]; for (int i = 0; i < n; i++) { array[i] = scanner.nextInt(); } System.out.println(solve(array, m)); scanner.close(); } public static int solve(int[] num, int m) { if (num == null) return 0; int len = num.length; if (len == 0) return 0; int sum = 0, max = 0; for (int i = 0; i < m; i++) { sum += num[i]; } max = sum; for (int i = 1; i <= len - m; i++) { sum -= num[i - 1]; sum += num[i + m-1]; if (max < sum) max = sum; } for (int i = len - m + 1, j = 0; i < len; i++, j++) { sum = sum - num[i - 1] + num[j]; if (max < sum) max = sum; } return max; } }