某同学最近迷上打怪升级的小游戏,该总共有n个关卡,每个关卡需要消耗的能量值为Wi,每个关下能获得Wj的能量。但是由于游戏限制,玩家必须连续的过关下,不可出现跳关的操作,不过允许自己选择开始的关下以及允许随时停止游戏,下面将给出每个关下的游戏消耗值和收获值,你能帮助该同学找到能收获能量的最大值吗?(游戏过程中允许出现负数情况)
输入格式:
第一行输入关下数n
第二行输入1~n个关下的消耗能量
第三行输入1~n个关下的获得能量
输出格式:
输出一个整数,表示获得能量的最大值
输入样例:
101 2 3 4 5 6 7 8 9 1010 9 8 7 6 5 4 3 2 1
输出样例:
25
题意分析:
这一题其实是蛮有意思的,首先对题目的理解,就是你在一个游戏的闯关过程中,你有消耗值和得到值,如果你的消耗值小于得到值,那么你的积累值(经验)就越大,反之越小,你自然是想要你的积累数值越大 錒,然后还有一个要求就是是连续的,你所需要的是连续的关卡数,然后在这个的情况下去获得最大的数值。我想你大致是明白这个题目的要求了。
但是由于游戏限制,玩家必须连续的过关下,不可出现跳关的操作,不过允许自己选择开始的关下以及允许随时停止游戏,下面将给出每个关下的游戏消耗值和收获值,你能帮助该同学找到能收获能量的最大值吗?
做题的步骤分析:
首先输入一个数值n,n代表你游戏的关卡数目既然是要求你有开始的关卡数,那么你势必在每个关卡中会有对应的消耗值和获得值那么定义俩数组怎么样,第一个数组来存放消耗值,第二个数组来存放收获值那么这就结束了吗? 显然没有,我是不是要去存放俩数组的差值,第二个数组减去第一个数组。如果数为正,那么说明我的经验值是在增加,反之是在减少,然后我在在这个数组里来去求我的前n项的正数和,确保我得到的数值是最大那么就有疑问了,想法是很好,那么怎么实现呢?
如下:
我可以去定义三个数组,arr1{N},arr2[N]是在main中,但是arr3【N】是在全局数组中,
然后对第一个消耗值的输入,同理对第二行得到值的输入,反正是俩,为何不定义两次呢
while (i<n) {
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) //houxareturn -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 1000int 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;//初始和为0int 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;}
如果觉得《打怪升级(考验思路)》对你有帮助,请点赞、收藏,并留下你的观点哦!