打怪升级(考验思路)
某同学最近迷上打怪升级的小游戏,该总共有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
题意分析:
这一题其实是蛮有意思的 ,首先对题目的理解,就是你在一个游戏的闯关过程中,你有消耗值和得到值,如果你的消耗值小于得到值,那么你的积累值(经验)就越大,反之越小,你自然是想要你的积累数值越大 錒,然后还有一个要求就是是连续的,你所需要的是连续的关卡数,然后在这个的情况下去获得最大的数值。我想你大致是明白这个题目的要求了。
但是由于游戏限制,玩家必须连续的过关下,不可出现跳关的操作,不过允许自己选择开始的关下以及允许随时停止游戏,下面将给出每个关下的游戏消耗值和收获值,你能帮助该同学找到能收获能量的最大值吗?
做题的步骤分析:
- 首先输入一个数值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) //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;
}