题解:P4922 [MtOI2018] 崩坏3?非酋之战!
题目:
只有仨有用的。(易证)
邻项交换证明可以发现:技能、分支、技能、分支、技能、分支……大招大招大招大招大招大招……(易证)
但是这样只能拿 \(85\) 分。
我们发现最后大招阶段技能的系数是 \((cnt3+5)\),\(cnt3\) 是减速 buff 层数。
所以我们的最优策略可能要技能 buff 比减速 buff 多 \([0,5]\) 层。
所以在大招前额外放 \(0\) 到 \(5\) 个技能,枚举就好了。
我们就枚举前面的技能分支循环的部分,后面全放大招,同时在放大招前也枚举额外的 \(0\) 到 \(5\) 个技能。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll unsigned long long
ll n,hp,atk,cnt1,cnt3,nw,ans2;
int ans1,ok;
void kaida(int kai)
{
ll cab=nw;
for(int i=kai;i<=n;i++)
{
cab+=cnt1*(cnt3+1)*atk;
cab+=12*atk+5*cnt1*atk;
if(cab>=hp)
{
ans1=min(ans1,i),ok=1;
break;
}
}
ans2=max(ans2,cab);
}
void go()
{
kaida(1);
for(int i=1;i<=n;i++)
{
nw+=cnt1*(cnt3+1)*atk;
if(i&1)
{
cnt1++,nw+=8*atk;
ll cab=nw,yuan=cnt1;
for(int j=i+1;j<=min(n,(ll)i+5);j++)
{
nw+=cnt1*(cnt3+1)*atk;
cnt1++,nw+=8*atk;
if(nw>=hp)
{
ans1=min(ans1,j),ok=1;
break;
}
kaida(j+1);
}
nw=cab;
cnt1=yuan;
}
else cnt3++,nw+=7*atk;
if(nw>=hp)
{
ans1=min(ans1,i),ok=1;
break;
}
kaida(i+1);
}
}
signed main()
{
cin>>n>>hp>>atk,atk/=10;
ans1=n;
go();
if(ok) cout<<ans1<<"\n"<<"Tech Otakus Save The World!";
else cout<<ans2<<"\n"<<"MiHoYo Was Destroyed!";
return 0;
}