大厂笔试题
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
3.7 KiB

  1. // /*
  2. // */
  3. // #include <iostream>
  4. // using namespace std;
  5. // // class T
  6. // // {
  7. // // public:
  8. // // T(int i=0):x(i){ c++;}
  9. // // ~T(){cout<<c<<"_";c--;}
  10. // // private:
  11. // // static int c;
  12. // // int x;
  13. // // };
  14. // // int T::c=0;
  15. // // int main()
  16. // // {
  17. // // T *p2=new T(123);
  18. // // delete p2;
  19. // // T p1[3]={1,2,3};
  20. // // return 0;
  21. // // }
  22. // class P
  23. // {
  24. // public:
  25. // P(int i=0,int j=0):X(i),Y(j){num++;}
  26. // int GetX(){return X;}
  27. // int GetY(){return Y;}
  28. // void show(){cout<<X<<" "<<Y<<"_";}
  29. // static int num;
  30. // private:int X,Y;
  31. // };
  32. // int P::num=0;
  33. // int main(){
  34. // P D(1,2),*j=&D;
  35. // int *q=&P::num;
  36. // cout<<j->num;//1
  37. // // cout<<j->*q;//2
  38. // cout<<P::num;//3
  39. // cout<<P::*q; //4
  40. // return 0;
  41. // }
  42. #include <iostream>
  43. #include <vector>
  44. #include <algorithm>
  45. using namespace std;
  46. int main() {
  47. int n, x, y, k;
  48. cin >> n >> x >> y >> k;
  49. vector<int> a(n), b(n), c(n);
  50. for (int i = 0; i < n; ++i) cin >> a[i];
  51. for (int i = 0; i < n; ++i) cin >> b[i];
  52. for (int i = 0; i < n; ++i) cin >> c[i];
  53. // dp[i][0]表示第i秒在上路的最大收益
  54. // dp[i][1]表示第i秒在中路的最大收益
  55. // dp[i][2]表示第i秒在下路的最大收益
  56. vector<vector<long long>> dp(n + 1, vector<long long>(3, 0));
  57. // 初始状态:第0秒,小明在中路
  58. dp[0][1] = 0; // 在中路
  59. for (int i = 1; i <= n; ++i) {
  60. // 在上路的最大收益
  61. dp[i][0] = max(dp[i-1][0], dp[i-1][1] - x) + a[i-1];
  62. if (x <= k) {
  63. dp[i][0] = max(dp[i][0], dp[i-1][1] + a[i-1] / 2);
  64. }
  65. // 在中路的最大收益
  66. dp[i][1] = max({dp[i-1][1], dp[i-1][0] - x, dp[i-1][2] - y}) + b[i-1];
  67. if (x <= k) {
  68. dp[i][1] = max(dp[i][1], dp[i-1][0] + b[i-1] / 2);
  69. }
  70. if (y <= k) {
  71. dp[i][1] = max(dp[i][1], dp[i-1][2] + b[i-1] / 2);
  72. }
  73. // 在下路的最大收益
  74. dp[i][2] = max(dp[i-1][2], dp[i-1][1] - y) + c[i-1];
  75. if (y <= k) {
  76. dp[i][2] = max(dp[i][2], dp[i-1][1] + c[i-1] / 2);
  77. }
  78. }
  79. // 结果是第n秒时,在三条路上获得的最大收益
  80. long long max_coins = max({dp[n][0], dp[n][1], dp[n][2]});
  81. cout << max_coins << endl;
  82. return 0;
  83. }
  84. // int main() {
  85. // int n, x, y, k;
  86. // cin >> n >> x >> y >> k;
  87. // vector<int> a(n), b(n), c(n);
  88. // for (int i = 0; i < n; ++i) cin >> a[i];
  89. // for (int i = 0; i < n; ++i) cin >> b[i];
  90. // for (int i = 0; i < n; ++i) cin >> c[i];
  91. // // dp[i][0]表示第i秒在上路的最大收益
  92. // // dp[i][1]表示第i秒在中路的最大收益
  93. // // dp[i][2]表示第i秒在下路的最大收益
  94. // vector<vector<long long>> dp(n + 1, vector<long long>(3, 0));
  95. // // 初始状态:第0秒,小明在中路
  96. // dp[0][1] = 0; // 在中路
  97. // for (int i = 1; i <= n; ++i) {
  98. // // 在上路的最大收益
  99. // dp[i][0] = max(dp[i-1][0], dp[i-1][1] - x) + a[i-1];
  100. // if (x <= k) {
  101. // dp[i][0] = max(dp[i][0], dp[i-1][1] + a[i-1] / 2);
  102. // }
  103. // // 在中路的最大收益
  104. // dp[i][1] = max({dp[i-1][1], dp[i-1][0] - x, dp[i-1][2] - y}) + b[i-1];
  105. // if (x <= k) {
  106. // dp[i][1] = max(dp[i][1], dp[i-1][0] + b[i-1] / 2);
  107. // }
  108. // if (y <= k) {
  109. // dp[i][1] = max(dp[i][1], dp[i-1][2] + b[i-1] / 2);
  110. // }
  111. // // 在下路的最大收益
  112. // dp[i][2] = max(dp[i-1][2], dp[i-1][1] - y) + c[i-1];
  113. // if (y <= k) {
  114. // dp[i][2] = max(dp[i][2], dp[i-1][1] + c[i-1] / 2);
  115. // }
  116. // }
  117. // // 结果是第n秒时,在三条路上获得的最大收益
  118. // long long max_coins = max({dp[n][0], dp[n][1], dp[n][2]});
  119. // cout << max_coins << endl;
  120. // return 0;
  121. // }