当前位置:   article > 正文

2023华为od机试C卷【跳格子3】C语言 实现_跳格子c语言

跳格子c语言

目录

题目

思路

Code


题目

小明和朋友们一起玩跳格子游戏,每个格子上有特定的分数score =  [1 -1-6 7 -17 7],从起点score[0]开始,每次最大的步长为k,请你返回小明跳到终点score[n-1]时,能得到的最大得分。

格子的总长度和步长的区间在[1,100000]
每个格了的分数在[-10000,10000]区间中


输入描述
6//第一行输入总的格了数量
1 -1 -6 7 -17 7/第二行输入每个格子的分数score[i]
2//第三行输入最大跳的步长k

输出描述:

一个整数代表最大得分。

示例1:

输入:

6
1 -1 -6 7 -17 7
2
输出:

14

思路

1:这题还是一个很久没考到过的动态规划类的题目。

2:其实状态转移方程还是比较好推导的cache[i] = max(cache[i-k] ~cache[i-1]) + score[i],有一个优化的点就是我们可以用一个队列来保存其中cache[i-k]~cache[i-1]的最大值。

Code

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. #include <math.h>
  6. #include <limits.h>
  7. #include <float.h>
  8. #include <regex.h>
  9. #include <ctype.h>
  10. #define CEILING_POS(X) ((X-(int)(X)) > 0 ? (int)(X+1) : (int)(X))
  11. #define CEILING_NEG(X) ((X-(int)(X)) < 0 ? (int)(X-1) : (int)(X))
  12. #define CEILING(X) ( ((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X) )
  13. #define MIN(a, b) ((a) < (b)) ? (a) : (b)
  14. #define MAX(a, b) ((a) > (b)) ? (a) : (b)
  15. int cmpfunc_str (const void * a, const void * b) {
  16. return strcmp(a ,b);
  17. }
  18. int cmpfunc (const void * a, const void * b) {
  19. return ( *(int*)a - *(int*)b );
  20. }
  21. //qsort(dp, m+1, sizeof(int), cmpfunc);
  22. /*
  23. char input[200000];
  24. fgets(input, 200000, stdin);
  25. //逗号分隔
  26. char* token = strtok(input, ",");
  27. int v[1000];
  28. int score1 = 0;
  29. while (token != NULL) {
  30. v[score1++] = atoi(token);
  31. token = strtok(NULL, ",");
  32. }*/
  33. int cmp(const void *a,const void *b)
  34. {
  35. int *ap = (int *)a;
  36. int *bp = (int *)b;
  37. if(bp[0] == ap[0]){
  38. return ap[1]>bp[1];
  39. } else {
  40. return ap[0]>bp[0];
  41. }
  42. }
  43. //qsort(a, n, sizeof(a[0]), cmp);
  44. int main() {
  45. char input1[200];
  46. fgets(input1, 200, stdin);
  47. int n= atoi(input1);
  48. char input[200000];
  49. fgets(input, 200000, stdin);
  50. char* token = strtok(input, " ");
  51. int nums[1000];
  52. int count = 0;
  53. while (token != NULL) {
  54. nums[count++] = atoi(token);
  55. token = strtok(NULL, " ");
  56. }
  57. char input2[200];
  58. fgets(input2, 200, stdin);
  59. int k = atoi(input2);
  60. int queue[n][2];
  61. int cache[n];
  62. for (int i = 0; i < n; i++) {
  63. queue[i][0] = 0;
  64. queue[i][1] = 0;
  65. cache[i] = 0;
  66. }
  67. cache[0] = nums[0];
  68. queue[0][0] = 0;
  69. queue[0][1] = cache[0];
  70. int index1 = 0;
  71. int index2 = 1;
  72. int i=1;
  73. while(true){
  74. if(i>=n){
  75. break;
  76. } else {
  77. while(index1<index2){
  78. if(queue[index1][0] < i - k){
  79. index1 +=1;
  80. } else {
  81. break;
  82. }
  83. }
  84. cache[i] = nums[i] + queue[index1][1];
  85. while(index1<index2){
  86. if(queue[index1][1] <= cache[i]){
  87. index1 +=1;
  88. }else {
  89. break;
  90. }
  91. }
  92. queue[index2][0] = i;
  93. queue[index2][1] = cache[i];
  94. index2+=1;
  95. }
  96. i+=1;
  97. }
  98. printf("%d", cache[n - 1]);
  99. return 0;
  100. }

【华为od机试真题Python+JS+Java合集】【超值优惠】:Py/JS/Java合集

【华为od机试真题Python】:Python真题题库

【华为od机试真题JavaScript】:JavaScript真题题库

【华为od机试真题Java】:Java真题题库

【华为od机试真题C++】:C++真题题库

【华为od机试真题C语言】:C语言真题题库

【华为od面试手撕代码题库】:面试手撕代码题库

【华为od机试面试交流群:830285880】

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/432622
推荐阅读
相关标签
  

闽ICP备14008679号