6 条题解

  • 40
    @ 2022-12-11 15:49:41

    首先,N 块空地必须得都种上草,不然就浪费了。

    其次,造成伤害的只有红草,有持续效果的是蓝草和绿草,所以为了让伤害尽可能地高,肯定是蓝草和绿草放前面,后面是连续的红草。

    但是蓝草和绿草的放置顺序就没有办法直接确定了,所以我们可以定义状态 f[i][j],表示前 i+j 块草地中,有 i 块蓝草和 j 块绿草的情况下,僵尸所失去的最大生命值(不包括后面的红草所带来的杀伤值)。

    对于每一个状态 f[i][j],它只有可能从以下两种状态转化而来:

    1. i+j1块草坪中,有 i块蓝草和 j1 块绿草,第 i+j 块草坪种绿草,此时僵尸经过第 i+j块草坪造成的伤害的损耗为 (i×B+T)×G×**(j−1**)
    2. i+j1 块草坪中,有 i1块蓝草和 j 块绿草,第 i+j 块草坪种蓝草,此时僵尸经过第 i+j 块草坪造成的伤害的损耗为 ((i1)×B**+T)×G×j**

    所以

    f[i][j]=max{f[i][j1**]+(i×B+T)×G×(j1),f[i1**][j]+((i1)×B**+T)×G×j**}

    i+j块草地中有 i块种蓝草,j块种绿草的情况下,对于剩余 nij块种红草的草坪来说:

    • 经过每块红草的时间都为 i×B+T
    • 经过每块红草收到的伤害是红草的物理伤害加上累积的毒伤 R+j×G

    所以经过后 nij 块草坪的总伤害为

    (nij**)×(i×B+T)×(R+j×G)**

    所以最终的答案为

    max{f[i][j]+(nij**)×(i×B+T)×(R+j×G)**}

    AC代码

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 3030;
    int n;
    long long R, G, B, T, f[maxn][maxn], ans;
    int main()
    {
        cin >> n >> R >> G >> B >> T;
        for (int i = 0; i <= n; i ++) 
        {
            for (int j = 0; i+j <= n; j ++) 
            {
                if (j) 
                    f[i][j] = max(f[i][j], f[i][j-1] + (i*B+T)*G*(j-1));
                if (i) 
                    f[i][j] = max(f[i][j], f[i-1][j] + ((i-1)*B+T)*G*j);
                ans = max(ans, f[i][j] + (n-i-j) * (i*B+T) * (R+j*G));
            }
        }
        cout << ans << endl;
        return 0;
    }
    
    • 6
      @ 2024-3-20 18:01:33
      #include <bits/stdc++.h>
      using namespace std;
      const int maxn = 3030;
      int n;
      long long R, G, B, T, f[maxn][maxn], ans;
      int main()
      {
          cin >> n >> R >> G >> B >> T;
          for (int i = 0; i <= n; i ++) 
          {
              for (int j = 0; i+j <= n; j ++) 
              {
                  if (j) 
                      f[i][j] = max(f[i][j], f[i][j-1] + (i*B+T)*G*(j-1));
                  if (i) 
                      f[i][j] = max(f[i][j], f[i-1][j] + ((i-1)*B+T)*G*j);
                  ans = max(ans, f[i][j] + (n-i-j) * (i*B+T) * (R+j*G));
              }
          }
          cout << ans << endl;
          return 0;
      }
      
      • -2
        @ 2024-1-16 14:17:32

        是谁做到了那个TLE?

        • -10
          @ 2024-1-23 10:30:39

          d66666666

          • -40
            @ 2023-2-6 15:27:12

            写题解请注意

            鼓励大家写题解,但注意题解格式。

            题解一定要有思路解析或代码注释,能否让别人理解你的思路

            也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

            给代码两端加上这个会舒服一些

            ```cpp

            你的代码

            ```

            </span>

            这个点在键盘的左上角tab上面那个键,注意切换输入法

            #include<iostream>
            using namespace std;
            int main()
            {
                int n;
                cin>>n;//这是一个注释
                return 0;
            }
            

            请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

            抄袭题解一经发现直接取消成绩。

            题解被删除的可能

            1. 代码不符合格式规范
            2. 没有思路讲解或者没有注释,
            3. 无意义的题解

            大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

            • -42
              @ 2021-10-7 22:12:53

              这不就是PvZ2天空之城的技能关吗? 第8关和第16关

              • @ 2022-11-20 13:29:15

                废话

              • @ 2022-11-20 16:35:05

                你说这有什么用?

              • @ 2022-12-5 20:10:10

                @

              • @ 2022-12-5 20:11:02
                
                

                #include <bits/stdc++.h> using namespace std; int n,x,y,z,maxx=0x3f3f3f3f,sum; int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;iii<=n;i++) { for(int j=i;ijj<=n;j++) { int k=n/i/j; if(ijk==n) { sum=ij2+ik2+jk2; maxx=min(maxx,sum); } } } cout<<maxx; return 0; }

              • @ 2023-4-24 20:09:23

                #include <bits/stdc++.h> using namespace std; const int maxn = 3030; int n; long long R, G, B, T, f[maxn][maxn], ans; int main() { cin >> n >> R >> G >> B >> T; for (int i = 0; i <= n; i ++) { for (int j = 0; i+j <= n; j ++) { if (j) f[i][j] = max(f[i][j], f[i][j-1] + (iB+T)G(j-1)); if (i) f[i][j] = max(f[i][j], f[i-1][j] + ((i-1)B+T)Gj); ans = max(ans, f[i][j] + (n-i-j) * (iB+T) * (R+jG)); } } cout << ans << endl; return 0; }

              • @ 2023-4-24 20:09:34

                #include <bits/stdc++.h> using namespace std; const int maxn = 3030; int n; long long R, G, B, T, f[maxn][maxn], ans; int main() { cin >> n >> R >> G >> B >> T; for (int i = 0; i <= n; i ++) { for (int j = 0; i+j <= n; j ++) { if (j) f[i][j] = max(f[i][j], f[i][j-1] + (iB+T)G(j-1)); if (i) f[i][j] = max(f[i][j], f[i-1][j] + ((i-1)B+T)Gj); ans = max(ans, f[i][j] + (n-i-j) * (iB+T) * (R+jG)); } } cout << ans << endl; return 0; }

              • @ 2023-9-26 20:21:19

                chao ba

              • @ 2023-12-3 21:07:02

                你说和没说一样

              • @ 2024-2-13 12:13:22

                我开个天空之城看一下👀️

              • @ 2024-5-10 21:02:10

                @+1 👍

            • 1

            信息

            ID
            1242
            时间
            1000ms
            内存
            256MiB
            难度
            2
            标签
            递交数
            308
            已通过
            193
            上传者