求最小连续和(洛谷P1614题题解,Java语言描述)
程序员文章站
2022-07-13 13:46:57
...
题目要求
分析
既然是要求最小连续和,那就需要存储连续的M个数据,还需要保存最小的和以及当前的和。
先开循环,把M和数据读入M长度数组中,保存好数据,完成求和。
接下来就是后续处理了。
试想:如果我们不存储每个数,那后续就没法进行了……
所以每个数都要存储,但不能每次都全部折腾一遍,那怎么办呢?
就嘿嘿嘿,用类似循环队列的数组吧,只不过这个队列必然是满的,每次都是换下去一个而已。
怎么实现呢?其实很简单,就需要一个int类型的指针,标记最早进入数组的一个数据的索引就可以啦。
变更pointer的代码是pointer = (pointer+1)%range;
过程中的操作,多仔细一些就好啦。
AC代码(Java语言描述)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt(), range = scanner.nextInt(), sum = 0, pointer = 0, tempSum;
int[] array = new int[range];
for (int i = 0; i < range; i++) {
int temp = scanner.nextInt();
sum += temp;
array[i] = temp;
}
tempSum = sum;
for (int i = range; i < num; i++) {
int temp = scanner.nextInt();
tempSum = tempSum - array[pointer] + temp;
array[pointer] = temp;
pointer = (pointer+1)%range;
if (tempSum < sum) {
sum = tempSum;
}
}
scanner.close();
System.out.println(sum);
}
}
推荐阅读
-
动态规划求解"疯狂的采药"问题(洛谷P1616题题解,Java语言描述)
-
用贪心策略均分纸牌(洛谷P1031题题解,Java语言描述)
-
最大公约数和最小公倍数问题(洛谷P1029题题解,Java语言描述)
-
加括号改变连除式结果(洛谷P2651题题解,Java语言描述)
-
去重的Set解不出“斯诺登的密码”(洛谷P1603题题解,Java语言描述)
-
求子集元素之和(洛谷P2415题题解,Java语言描述)
-
数列分段(洛谷P1181题题解,Java语言描述)
-
在小范围内[打表]验证哥德巴赫猜想(洛谷P1579题题解,Java语言描述)
-
长方体工艺品の切割(洛谷P5729题题解,Java语言描述)
-
大肆宣传~打表判断回文质数(洛谷P1217题题解,Java语言描述)