首页 > 其他分享 >NFLS NOI模拟 大战波特

NFLS NOI模拟 大战波特

时间:2024-05-09 23:12:33浏览次数:21  
标签:NOI 效果 Boss 回合 回复 使用 咒语 NFLS 波特

涉及知识点:贪心

前言

思维难度不高,就是挺好玩的,随手记录下有意思的贪心,奇妙的贪心经常比复杂的 DP 还有意思。

题意

打 Boss,总共可以打 \(n\ (\leq10^6)\) 回合,每回合可以普攻一次,造成 \(x\) 点伤害,每回合可以使用咒语,总共最多使用 \(k\) 次,使得 Boss 赋予一层“中毒”效果,并减弱一层“回复”效果(如果之前存在“回复”效果的话),Boss 每回合也可以使用咒语给自己赋予一层”回复“效果,注意同一回合可以同时普攻与使用咒语。“中毒”效果指每回合结束后 Boss 受到 \(p\) 点伤害,“回复”效果指每回合结束后 Boss 得到 \(r\) 点血量。不存在血量上限或下限,效果可叠加,已知 Boss 哪些回合使用 ”回复“ 咒语,求 \(n\) 回合后 Boss 最多掉了多少血(可能为负数)。

思路

阻碍我们贪心的最大问题在于要同时考虑减弱”回复“效果和造成持续伤害,因此我们可以尝试将”回复“效果直接量化为血量的变化。并且有贪心策略:如果我们想要减弱某一层”回复“效果,一定是直接就在该”回复“效果产生的回合使用咒语最优,”回复“效果产生后几回合才减弱它是一定不优的。

我们首先假设每回合 Boss 的”回复“都生效且没被减弱,如果回合 \(i\) 时 Boss 使用了咒语,那么我方使用咒语带来的总伤害为 \((p+r)(n-i+1)\)(要把”回复“那部分抵消),否则总伤害为 \(p(n-i+1)\),将每个回合使用咒语的预期伤害排序后选最大 \(k\) 个即可。并且使用或不使用咒语的伤害序列分别有单调性,最后可以使用归并排序做到严格线性。

FAQ:

有人可能会疑问为什么 Boss 不使用咒语时,我方使用咒语的伤害就只有 \(p(n-i+1)\)?因为可以证明贪心到这个时候时 Boss 一定是没有”回复“效果的:如果 \(i\) 前面有某个回合 \(j\) Boss 使用了咒语并且没有被减弱,那么我们直接在 \(j\) 使用咒语造成的伤害一定更高。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=1e6+5;
LL n,x,r,p,k;
LL ans=0,atk[MAXN];
string opt;
int main(){
    // freopen("bot.in","r",stdin);
    // freopen("bot.out","w",stdout);
    cin>>n>>x>>r>>p>>k>>opt;
    for(int i=0;i<n;i++){
        ans+=x;
        if(opt[i]=='1'){
            ans-=r*(n-i);
            atk[i]=(p+r)*(n-i);
        }
        else{
            atk[i]=p*(n-i);
        }
    }
    sort(atk,atk+n,greater<LL>());
    for(int i=0;i<k;i++){
        ans+=atk[i];
    }
    cout<<ans<<endl;
    return 0;
}

标签:NOI,效果,Boss,回合,回复,使用,咒语,NFLS,波特
From: https://www.cnblogs.com/SkyNet-PKN/p/18183290

相关文章

  • 洛谷 P1031 [NOIP2002 提高组] 均分纸牌 题解
    题目简述有$N$堆纸牌,编号分别为$1,2,\ldots,N$。每堆上有若干张,但纸牌总数必为$N$的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为$1$堆上取的纸牌,只能移到编号为$2$的堆上;在编号为$N$的堆上取的纸牌,只能移到编号为$N-1$的堆上;其他堆上取的纸牌,可......
  • 洛谷 P1012 [NOIP1998 提高组] 拼数 题解
    题目简述设有$n$个正整数$a_1\dotsa_n$,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。题目分析定义设$X$为数字$x$的字符串形式。$A+B$表示字符串$A$和字符串$B$相连组成的字符串。思路既然要构造最优解,显然如果有不优的情况的话,就需要对序列进行......
  • P3193 [HNOI2008] GT考试 题解
    之前学矩阵乘的时候做的题,当时因为不会\(kmp\)搜索一稀里糊涂过去了,现在填个坑。头图是\(Logos\)!P3193[HNOI2008]GT考试题链:洛谷题库题目大意:求有多少个长度为\(n\)的数字串的子串中不包含给出的长度为\(m\)位的串,范围\(n<=1e9\),$m<=20$。思路:首先考虑DP,令\(......
  • 初三下——NOIP 模拟赛(6~10)
    6ConclusionT1注意到一次碰撞后下一次一定不会碰到,一直这样直到出去。二分找位置即可然后算一下贡献。T2dp部分重排过后肯定是0+01+1的形式。于是根据这个dp。上面的dp冗余在其对于段数枚举了分界点。于是我们考虑就对于当前这个元素\(i\)进行单独考虑。记录是......
  • 洛谷P2375 [NOI2014] 动物园
    动物园题目描述输入格式输出格式输入输出样例输入3aaaaaababcababc输出36132开始时都没看出来这是kmp板子题先看看AC代码吧#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintmaxn=1e6+10;constintmod=1e9+7;chara[maxn];in......
  • 初三下——NOIP 模拟赛(1~5)
    R1rk10-。220pts。T23都读错题。浪费了将近60分钟。改。T2对于组合的掌握仍然不够熟练。找规律考虑每个点的贡献,应该使用0/1,而不是原数。转化过后可以在01矩阵上找规律了。(现在还是没搞懂那个原理)=》组合\((i,j)\bmod2=1\),当前仅当j在二进制下是i的子集,根据......
  • P1028 [NOIP2001 普及组] 数的计算
    题目链接:观察样例。当输入\(n=6\)时,6本身算一个。当6后加的数为1时只有一个。6后加的数为2时有62,621两个。6后加的数为3时有63、631两个。可以看到,我们往\(n\)后加的每一个不超过\(\dfrac{n}{2}\)的数都可以继续延伸。考虑递推。\(f[i]\)表示以\(i......
  • 初三下——NOIP 模拟赛(1~5)
    R1rk10-。220pts。T23都读错题。浪费了将近60分钟。改。T2对于组合的掌握仍然不够熟练。找规律考虑每个点的贡献,应该使用0/1,而不是原数。转化过后可以在01矩阵上找规律了。(现在还是没搞懂那个原理)=》组合\((i,j)\bmod2=1\),当前仅当j在二进制下是i的子集,根据......
  • P1010 [NOIP1998 普及组] 幂次方
    题目:P1010[NOIP1998普及组]幂次方[NOIP1998普及组]幂次方题目描述任何一个正整数都可以用2的幂次方表示。例如137=27+23+2^0。同时约定次方用括号来表示,即a^b可表示为a(b)。由此可知,137可表示为2(7)+2(3)+2(0)进一步:$7=22+2+20(2^1用2表示),并且3=2+2^......
  • P10064 [SNOI2024] 公交线路 题解
    弱化版:CF1827EBusRoutes。对于\(n=2\)的情况可以判掉,剩下的情况取一个度数大于一的点作为根。首先发现如果叶子间满足条件,那么整棵树也满足条件。考虑叶子间什么时候满足条件,记点\(x\)通过最多一条路径可以到达的所有点的集合为\(S_x\),则需满足\(\forallx,y\in\mathbf......