Problem F. Fighting Against Monsters dp

Posted bxd123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Problem F. Fighting Against Monsters dp相关的知识,希望对你有一定的参考价值。

  XIX Open Cup named after E.V. Pankratiev Stage 15, Grand Prix of China

 

题意:

有三只怪兽,两只小怪(hp<=100),一个boss(hp<=1e6) 每回合开始 ,勇士先收到所有活着的怪物的攻击力总和的伤害,然后对一只怪兽造成回合i点的伤害(每回合递增1),问勇士最少耗费多少血杀死所有的怪兽

题解:

技术图片
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+100;
const ll inf=(1ll<<61)-1;
ll dp[105][205][205],atk[4],hp[4],newatk[3],cost;

ll gao(ll H) {
    ll t=(sqrtl(1+8*H)-1)/2;
    while(t*(t+1)/2>H)t--;
    while(t*(t+1)/2<H)t++;
    return t;
}

int main() {
    int cas;cin>>cas;
    while(cas--) {
        scanf("%lld%lld%lld%lld%lld%lld",&hp[1],&hp[2],&hp[3],&atk[1],&atk[2],&atk[3]);
        for(int i=0;i<=100;i++)
            for(int j=0;j<200;j++)
                for(int k=0;k<200;k++)
                    dp[i][j][k]=inf;
        dp[0][0][0]=0;
        ll ans=inf;
        for(int i=1;i<=100;i++)
            for(int j=0;j<200;j++)
                for(int k=0;k<200;k++) if(dp[i-1][j][k]!=inf) {
                    cost=atk[1]*(j<hp[1])+atk[2]*(k<hp[2])+atk[3]*(i*(i-1)/2-k-j<hp[3]);//先算受到的伤害
                    if(j<hp[1]) dp[i][j+i][k]=min(dp[i][j+i][k],dp[i-1][j][k]+cost);
                    if(k<hp[2]) dp[i][j][k+i]=min(dp[i][j][k+i],dp[i-1][j][k]+cost);
                    if(i*(i-1)/2-k-j<hp[3]) dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][k]+cost);
        }

        for(int i=1;i<=100;i++)
            for(int j=0;j<200;j++)
                for(int k=0;k<200;k++) if(dp[i][j][k]!=inf&&j>=hp[1]&&k>=hp[2]&&i*(i+1)/2-k-j>=hp[3])
                    ans=min(ans,dp[i][j][k]);

        for(int i=100;i<=100;i++)
            for(int j=0;j<200;j++)
                for(int k=0;k<200;k++) if(dp[i][j][k]!=inf) {
                    newatk[1]=atk[1]*(j<hp[1]);
                    newatk[2]=atk[2]*(k<hp[2]);
                    if(newatk[1]>newatk[2])swap(newatk[1],newatk[2]);
                    ll t=gao(max(1ll*i*(i+1)/2,j+k+hp[3]));
                    ans=min(ans,dp[i][j][k]+ (t-i)*atk[3]+(t-i+1)*newatk[2]+(t-i+2)*newatk[1]);
        }
        printf("%lld
",ans);
    }
    return 0;
}
View Code

 

以上是关于Problem F. Fighting Against Monsters dp的主要内容,如果未能解决你的问题,请参考以下文章

2018HDU多校训练-3-Problem F. Grab The Tree

F. Interacdive Problem(二分&交互)

Codeforces1624 F. Interacdive Problem(交互,牛逼二分)

Codeforces1624 F. Interacdive Problem(交互,牛逼二分)

hdu 5618 Jam's problem again

CF868 F. Yet Another Minimization Problem 决策单调优化 分治