题目描述:
一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一个数字。
阿里巴巴念出一个咒语数字k(k<N),找出连续k个宝箱数字和的最大值,并输出该最大值。
输入描述:
第一行输入一个数字字串,数字之间使用逗号分隔,例如:2,10,-3,-8,40,5
*1 ≤ 字串中数字的个数 ≤ 100000
*-10000 ≤ 每个数字 ≤ 10000
第二行输入咒语数字,例如:4,咒语数字大小小于宝箱的个数
输出描述:
连续k个宝箱数字和的最大值,例如:39
测试用例1:
输入:
2,10,-3,-8,40,5
4
输出:
39
测试用例2:
输入:
8
1
输出:
8
解题思路:
1、滑动窗口计算每个数据,记录最大值。
2、注意起始值应为第一个数据的滑动窗口,不能设置为0,因为有负值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char str[20005];
int num;
fgets(str,20000,stdin);
scanf("%d",&num);
int arr[20000],arr_cnt = 0;
char *temp_str;
temp_str = strtok(str,",");
while(temp_str != NULL){
arr[arr_cnt++] = atoi(temp_str);
temp_str = strtok(NULL,",");
}
int max = 0;
//设置初始值,0起始,num个数据的和
for(int i = 0;i < num;i++){
max += arr[i];
}
for(int i = 1;i < arr_cnt;i++){
int sum = 0;
//滑动窗口,两个限制条件,1、起始位i,num个数据,2、最后一个数据(i + num)不能超出数列(<arr_cnt)
for(int j = i;i + num < arr_cnt && j < i + num;j++){
sum += arr[j];
}
//取最大值记录下来
if(sum > max) max = sum;
}
//打印
printf("%d",max);
}