• 打怪升级(考验思路)


      某同学最近迷上打怪升级的小游戏,该总共有n个关卡,每个关卡需要消耗的能量值为Wi​,每个关下能获得Wj​的能量。但是由于游戏限制,玩家必须连续的过关下,不可出现跳关的操作,不过允许自己选择开始的关下以及允许随时停止游戏,下面将给出每个关下的游戏消耗值和收获值,你能帮助该同学找到能收获能量的最大值吗?(游戏过程中允许出现负数情况)

    输入格式:

    第一行输入关下数n
    第二行输入1~n个关下的消耗能量
    第三行输入1~n个关下的获得能量

    输出格式:

    输出一个整数,表示获得能量的最大值


    输入样例:

    1. 10
    2. 1 2 3 4 5 6 7 8 9 10
    3. 10 9 8 7 6 5 4 3 2 1

    输出样例:

    25

    题意分析

    这一题其实是蛮有意思的 ,首先对题目的理解,就是你在一个游戏的闯关过程中,你有消耗值和得到值,如果你的消耗值小于得到值,那么你的积累值(经验)就越大,反之越小,你自然是想要你的积累数值越大 錒,然后还有一个要求就是是连续的,你所需要的是连续的关卡数,然后在这个的情况下去获得最大的数值。我想你大致是明白这个题目的要求了。

    但是由于游戏限制,玩家必须连续的过关下,不可出现跳关的操作,不过允许自己选择开始的关下以及允许随时停止游戏,下面将给出每个关下的游戏消耗值和收获值,你能帮助该同学找到能收获能量的最大值吗?

    做题的步骤分析:

    • 首先输入一个数值n,n代表你游戏的关卡数目
    • 既然是要求你有开始的关卡数,那么你势必在每个关卡中会有对应的消耗值和获得值
    • 那么定义俩数组怎么样,第一个数组来存放消耗值,第二个数组来存放收获值
    • 那么这就结束了吗? 显然没有,我是不是要去存放俩数组的差值,第二个数组减去第一个数组。如果数为正,那么说明我的经验值是在增加,反之是在减少,然后我在在这个数组里来去求我的前n项的正数和,确保我得到的数值是最大
    • 那么就有疑问了,想法是很好,那么怎么实现呢?

    如下:

    我可以去定义三个数组,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 足够说明这个数组就是空

    1. if (a == NULL || size == 0)    //houxa
    2.     
    3.         return -1;
    4.     }

    核心部分哈

    开始的时候,我在for循环中我不需要去有初始值,我直接不要了,但是我是要求我的具有这个长度的,因为我要靠这些长度来进行比较,然后我的sum值就是在加了一个数组的第一个arr[0],进行比较,如果我的添加后的元素小于原来的元素,那么我明显是很吃亏的嘛,我自然不能继续添加了,所以我的sum值就舍弃之前的元素,从现在开始叠加,但是如果我大于呢,我就赋值给max,这个就是那个比较数的大小一样的原理,最后肯定是是得到较大的额数值的。

    1. for (; index < size; ++index)
    2.     {
    3.         sum = sum + a[index];//遍历一个元素,累加一次
    4.         if (sum < a[index])//如果加上当前元素之后的和比当前元素还小,则舍弃之前的元素,从当前元素开始累加
    5.         {
    6.             sum = a[index];
    7.         }
    8.         if (sum > max)
    9.         {
    10.             max = sum;
    11.         }
    12.     }

     这是全部的代码,可编译。

    1. #include <stdio.h>
    2. #define N 1000
    3. int MaxSum(int a[], int size);
    4. int arr3[N];
    5. int main(void)
    6. {
    7. int n,t;
    8. int i=0, j=0,sum;
    9. int arr1[N], arr2[N];
    10. scanf("%d", &n);
    11. while (i<n) {
    12. scanf("%d", &arr1[i]);
    13. i++;
    14. }
    15. while (j < n) {
    16. scanf("%d", &arr2[j]);
    17. j++;
    18. }
    19. for (i = 0; i < n; i++) {
    20. arr3[i] = arr2[i] - arr1[i];
    21. }
    22. sum = MaxSum(arr3, n);
    23. printf("%d", sum);
    24. return 0;
    25. }
    26. int MaxSum(int a[], int size)
    27. {
    28. if (a == NULL || size == 0)
    29. {
    30. return -1;
    31. }
    32. int sum = 0;//初始和为0
    33. int index = 0;
    34. int max = a[index];//最大值最初必为数组第一个元素
    35. for (; index < size; ++index)
    36. {
    37. sum = sum + a[index];//遍历一个元素,累加一次
    38. if (sum < a[index])//如果加上当前元素之后的和比当前元素还小,则舍弃之前的元素,从当前元素开始累加
    39. {
    40. sum = a[index];
    41. }
    42. if (sum > max)
    43. {
    44. max = sum;
    45. }
    46. }
    47. return max;
    48. }
  • 相关阅读:
    MES系统是如何采集Modbus设备数据的呢?
    CSS------我又回来了
    wsl中安装虚拟环境virtualenv,pycharm中配置wsl解释器
    【Android UI】贝塞尔曲线 ⑤ ( 德卡斯特里奥算法 | 贝塞尔曲线递推公式 )
    轻量化认证:新型布线的认证核心
    了解一下知识付费系统的开发流程和关键技术点
    线程的创建和状态(操作系统和java)
    spark安装详细步骤
    Django框架web开发实战:Model和ORM学习(三)
    如何避免远程访问欺诈?让远程办公更加安全的六个建议
  • 原文地址:https://blog.csdn.net/m0_61196970/article/details/127820519