zoukankan      html  css  js  c++  java
  • P4922-[MtOI2018]崩坏3?非酋之战!【dp】

    正题

    题目链接:https://www.luogu.com.cn/problem/P4922


    题目大意

    题目好长直接放了

    在崩坏 3 中有一个叫做天命基地的地方,女武神们将在基地中开派对与敌人们厮杀。

    女武神们的攻击力为 (atk),她们将进行资源保卫战!

    天命基地中有 (1)个 boss,boss 的血量为 (hp),boss 不会攻击女武神。

    现在有一条长度为 (n) 的道路,道路的一头是 boss,另外一头是女武神需要保卫的资源,最开始 boss 每秒将会向资源移动 1 个单位长度。女武神们需要保护资源,所以她们要攻击 boss。

    我们将整条道路分成 (n) 个格子,最开始资源在第 (n) 格,女武神在第 (1) 格,boss 在第 (0) 格。

    因为女武神的手太短了,所以只有当 boss 到达女武神当前那一格的时候,女武神才会攻击 boss,攻击完之后女武神会后退一格。

    女武神有以下 (8) 种攻击方式(每一格只能使用一种攻击方式)

    • 技能,造成 (80\% atk) 的伤害,并使 boss 获得 (1) 层燃烧 buff,在之后的每秒钟额外受到 (10\% atk) 的伤害。(燃烧buff可以叠加)
    • 闪避,造成 (70\% atk) 的伤害,并使 boss 时间暂停 (5s)。((5s) 内 boss 无法移动且仍会受到燃烧伤害)
    • 大招,造成 (120\% atk) 的伤害,使 boss 时间暂停 (5s)
    • 分支攻击,造成 (70\% atk) 的伤害,并使 boss 时空减速,使 boss 经过每一个格子的时间增加 (1s)
    • 爱酱的炸弹,使 boss 获得 (1) 层燃烧 buff,并使 boss 愤怒,移速 (+50\%)
    • 犹大的誓约,造成 (60\% atk) 的伤害,如果 boss 有燃烧 buff 则减少 1 层,使 boss 时间暂停 (4s)
    • 奥托之光,造成 (10\% atk) 的伤害,如果 boss 有燃烧 buff 则清除 buff,使 boss 时间暂停 (10s)
    • 律者之力,造成 (80\% atk) 的伤害,使 boss 的移动速度 (+100\%)

    现在给你所有的信息,让你帮助 disangan233 蒟蒻算一下,他的女武神能否在 boss 触碰到资源前战胜 boss。

    如果可以,输出 boss 死亡时距离资源最远的格子编号。如果不可以,请输出对 boss 造成的最大伤害。

    对于 (100\%) 的数据,保证:

    [nleq 10,000 qquad atkequiv 0(mod 10)qquad atkleq 10,000qquad max Atkleq 2^{64}-1 ]


    解题思路

    快三年之前的比赛上面写的题了,那时候只会写(O(n^3))(dp)。(什么一雪前耻)

    首先有很多技能一看就是没有用的,有用的只有技能(叠燃烧),分支攻击(叠减速),大招。

    然后大招一定是最后放的,还有一个就是(n)的范围好像是可以(O(n^2))卡一下的。

    (f_{i,j})表示到前(i)次,(j)层燃烧,然后剩下(i-j)层就是减速了。

    这样(dp)就好了,时间复杂度(O(n^2))因为(jleq i)所以常数是(frac{1}{2})


    code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll unsigned long long
    using namespace std;
    const ll N=11000;
    ll n,hp,atk,maxs,mins,f[2][N];
    signed main()
    {
    	scanf("%lld%lld%lld",&n,&hp,&atk);atk/=10ull;
    	if(!atk)return printf("0
    MiHoYo Was Destroyed!");
    	mins=n;
    	for(ll i=0;i<n;i++){
    		for(ll j=0;j<=i;j++){
    			ll k=i-j+1;//燃烧j层 减速k层 
    			maxs=max(maxs,f[i&1][j]+atk*j*(n-i)*(5ull+k)+(n-i)*atk*12ull);
    			mins=min(mins,i+(hp-f[i&1][j]+(j*5ull+j*k+12ull)*atk-1)/(j*5ull+j*k+12ull)/atk);
    			f[~i&1][j+1]=max(f[~i&1][j+1],k*j*atk+atk*8ull+f[i&1][j]);//叠燃烧
    			f[~i&1][j]=max(f[~i&1][j],k*j*atk+atk*7ull+f[i&1][j]);//叠减速 
    		}
    	}
    	if(maxs>=hp)printf("%lld
    Tech Otakus Save The World!",mins);
    	else printf("%lld
    MiHoYo Was Destroyed!",maxs);
    	return 0;
    }
    
  • 相关阅读:
    LeetCode题解 | [简单-数组] 485.最大连续1的个数
    PAT乙级真题 | 1032 挖掘机技术哪家强
    [leetcode]两个列表的最小索引总和
    【leetCode】两个数组的交集
    手写hashMap(非红黑树)
    Redis 删除数据后不能自动释放内存的问题
    Spring @Async/@Transactional 失效的原因及解决方案
    完全平方数问题
    用队列实现栈
    memcached安装踩坑
  • 原文地址:https://www.cnblogs.com/QuantAsk/p/14728907.html
Copyright © 2011-2022 走看看