题解: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;
}
posted @ 2025-10-15 18:28  _a1a2a3a4a5  阅读(6)  评论(0)    收藏  举报