J. 铁刀磨成针

题目简介:

给定一把刀的初始攻击力和磨刀石的个数,每回合按顺序包括一下两个阶段

  1. 磨刀阶段:可以选择花费一单位磨刀石提升刀的攻击力一点(每回合最多一次);
  2. 攻击阶段:可以选择攻击,会对敌方造成等同于刀攻击力的伤害、并使刀的攻击力减一(每回合最多一次)。刀的攻击力归零时会损坏、此后再也不能攻击。 求 个回合可造成的最大攻击力

思路:

首先可以观察到:磨刀一定是从第一回合开始连续磨到不能磨为止,因为早磨刀在任何情况下都不会吃亏。所以磨刀策略是固定的。

所以我们只需要枚举从什么时候开始砍即可

代码如下

#include<bits/stdc++.h>
#define LL long long
using namespace std;
int t,n,x,y;
LL dc(LL a,LL b)
{
    LL cnt=(a*b)-b*(b-1)/2;
    return cnt;
}
LL check()
{
    LL ans=0;
    for(LL t=1;t<=min(n,y);t++)
    {
        LL tmp=0;
        LL atk=x+t,s1=min(n,y)-t;
        tmp+=atk*s1;
        tmp+=dc(atk,min(atk,n-min(n,y)+1ll));
        ans=max(ans,tmp);
    }
    return ans;
}
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>x>>y;
        cout<<check()<<endl;
    }
    return 0;
}

完结撒花