某同学最近迷上打怪升级的小游戏,该总共有n个关卡,每个关卡需要消耗的能量值为Wi,每个关下能获得Wj的能量。但是由于游戏限制,玩家必须连续的过关下,不可出现跳关的操作,不过允许自己选择开始的关下以及允许随时停止游戏,下面将给出每个关下的游戏消耗值和收获值,你能帮助该同学找到能收获能量的最大值吗?(游戏过程中允许出现负数情况)
输入格式:
第一行输入关下数n
第二行输入1~n个关下的消耗能量
第三行输入1~n个关下的获得能量
输出格式:
输出一个整数,表示获得能量的最大值
输入样例:
- 10
- 1 2 3 4 5 6 7 8 9 10
- 10 9 8 7 6 5 4 3 2 1
输出样例:
25
题意分析:
这一题其实是蛮有意思的 ,首先对题目的理解,就是你在一个游戏的闯关过程中,你有消耗值和得到值,如果你的消耗值小于得到值,那么你的积累值(经验)就越大,反之越小,你自然是想要你的积累数值越大 錒,然后还有一个要求就是是连续的,你所需要的是连续的关卡数,然后在这个的情况下去获得最大的数值。我想你大致是明白这个题目的要求了。
但是由于游戏限制,玩家必须连续的过关下,不可出现跳关的操作,不过允许自己选择开始的关下以及允许随时停止游戏,下面将给出每个关下的游戏消耗值和收获值,你能帮助该同学找到能收获能量的最大值吗?
做题的步骤分析:
如下:
我可以去定义三个数组,arr1{N},arr2[N]是在main中,但是arr3【N】是在全局数组中,
然后对第一个消耗值的输入,同理对第二行得到值的输入,反正是俩,为何不定义两次呢
while (i
scanf("%d", &arr1[i]);
i++;
}
当你精确到数组的某个地址时,其实能代表其所涵盖的数值
for (i = 0; i < n; i++) {
arr3[i] = arr2[i] - arr1[i];// 将俩个的差值存在第三个数组中
}
然后我开始调用函数,这个函数就是得到这个数组中连续数的前n项的最大数值并可以打印
sum = MaxSum(arr3, n);
printf("%d", sum);
函数的分析,我贼喜欢这个函数了(建议收藏)
第一步是判断你传入的数组时不是空,空的条件是俩(有一个就是空),当你传入的数组元素为NULL是或者这个数组的长度就是 0 足够说明这个数组就是空
- if (a == NULL || size == 0) //houxa
-
- return -1;
- }
核心部分哈
开始的时候,我在for循环中我不需要去有初始值,我直接不要了,但是我是要求我的具有这个长度的,因为我要靠这些长度来进行比较,然后我的sum值就是在加了一个数组的第一个arr[0],进行比较,如果我的添加后的元素小于原来的元素,那么我明显是很吃亏的嘛,我自然不能继续添加了,所以我的sum值就舍弃之前的元素,从现在开始叠加,但是如果我大于呢,我就赋值给max,这个就是那个比较数的大小一样的原理,最后肯定是是得到较大的额数值的。
- for (; index < size; ++index)
- {
- sum = sum + a[index];//遍历一个元素,累加一次
- if (sum < a[index])//如果加上当前元素之后的和比当前元素还小,则舍弃之前的元素,从当前元素开始累加
- {
- sum = a[index];
- }
- if (sum > max)
- {
- max = sum;
- }
- }
这是全部的代码,可编译。
- #include <stdio.h>
- #define N 1000
- int MaxSum(int a[], int size);
- int arr3[N];
- int main(void)
- {
- int n,t;
- int i=0, j=0,sum;
- int arr1[N], arr2[N];
- scanf("%d", &n);
- while (i<n) {
- scanf("%d", &arr1[i]);
- i++;
- }
- while (j < n) {
- scanf("%d", &arr2[j]);
- j++;
- }
- for (i = 0; i < n; i++) {
- arr3[i] = arr2[i] - arr1[i];
- }
-
- sum = MaxSum(arr3, n);
- printf("%d", sum);
- return 0;
- }
- int MaxSum(int a[], int size)
- {
- if (a == NULL || size == 0)
- {
- return -1;
- }
- int sum = 0;//初始和为0
- int index = 0;
- int max = a[index];//最大值最初必为数组第一个元素
- for (; index < size; ++index)
- {
- sum = sum + a[index];//遍历一个元素,累加一次
- if (sum < a[index])//如果加上当前元素之后的和比当前元素还小,则舍弃之前的元素,从当前元素开始累加
- {
- sum = a[index];
- }
- if (sum > max)
- {
- max = sum;
- }
- }
- return max;
- }