RPG的最终决斗(模拟)

RPG的最终决斗

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)

Total Submission(s) : 15   Accepted Submission(s) : 4

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

Luke最近沉迷一款RPG游戏,终于他要面临最终的BOSS决战了,Luke想在开始决斗之前看看角色有没有足够的伤害量在生命值耗尽前消灭BOSS。
经过推算,Luke发现他的角色可以存活n个回合。因为没有充钱,决斗时角色的初始攻击力A为0,攻击增量D也为0,每回合开始,角色触发被动技能,可以使攻击力A增加D,即A+=D。
角色有三个主动技能
技能1:对BOSS造成A+X点伤害。
技能2:使得角色的攻击力增加B,即A+=B。
技能3:使角色的攻击增量D增加C,即D+=C。
每一回合在触发被动技能后,角色可以使用一个主动技能,随后回合结束。
Luke想知道最多能对BOSS造成多少伤害量。

Input

第一行为正整数t表示测试组数。
随后为t组输入,每组测试中,有四个整数n X B C,分别表示回合数、技能1的基础伤害X、技能2的增量B、技能3的增量C。
0<t<=100  
0<n<=1000    
0<=X,B,C<=10^9

Output

对于每组测试数据,输出一行整数表示最大能造成的伤害量。

Sample Input

3
2 3 2 1
3 3 2 1
5 3 2 1

Sample Output

6
10
24

ac:

解析:

当知道1,2,3的使用次数后,我们想最大化伤害,一定是先3,再2,最后1

这里我们可以直接暴力模拟,复杂度O(n^2)

要注意公式整除问题

ac:

#include<bits/stdc++.h>
#define ZERO 1e-6
#define ll long long
using namespace std;
ll x,b,c;
 
ll solve(ll i,ll j,ll k)//i第一,j第二,k第三
{
    ll A=0,D=0;
 
    D=i*c;
    A+=(D-c)*i/2;
 
    A+=j*b+j*D;
 
    return A*k+x*k+k*(k+1)*D/2;
         //((2*A+(k+1)*D)/2+x)*k;错误,因为(k+1)*D可能不整除,我们化出来
         //k*(k+1)*D有奇有偶,一定可以整除
         //(D-c)*i/2;==c*(i-1)*i/2也是有奇有偶,可以整除
}
 
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll n;
        ll ans=0;
        scanf("%lld%lld%lld%lld",&n,&x,&b,&c);
 
        for(int i=0;i<=n;i++)
            for(int j=0;j<=n-i;j++)
                ans=max(ans,solve(i,j,n-i-j));
 
        printf("%lld\n",ans);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值