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;
}