CSU 1035: Max DPS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nameofcsdn/article/details/79964502

题目:

Description

       Liam 喜欢玩电脑游戏,他的最爱是“World of Bugcraft”。Liam在游戏中扮演了一个法师。法师通过吟唱法术攻击敌人。由于一开始Liam非常弱小,他只会一种法术—“火球术”,每次施展火球术都要消耗他3.5秒的施法时间。每个火球术对敌人造成1000点的基础伤害。有时候,火球术会造成致命一击,这时,火球术便会造成双倍伤害(初始情况下,Liam施放的“火球术”有10%的几率造成致命一击)。

       World of Bugcraft 给玩家提供了一定的“能力点”,玩家可以自由分配能力点来强化三项属性:法术能量、致命几率和施法速度。


       法术能量:每一点“能力点”可以转化为一点法术能量,每一点法术能量都能提高Liam施放的法术所造成的伤害。例如Liam有20点法术能量,那么他的火球术就能造成1000+20=1020点伤害,如果这次火球术产生了致命一击,那么就造成1020*2=2040点伤害。

       致命几率:每20点“能力点”可以转化为1%的致命几率,假设Liam使用了30点“能力点”用于强化致命几率,那么他就有(10+30/20)%=11.5%的致命几率。当然,致命几率的上限为100%。

       施法速度:每15点“能力点”可以转化为1%的施法速度。假设Liam使用了150点“能力点”用于强化施法速度,那么他施放火球术的时间就变成了3.5/(1+(150/15)%)=35/11s。

 

       在游戏中,玩家们经常以每秒伤害量DPS(Damage Per Second)来衡量角色的强弱。计算DPS的公式如下:

f = B*(1+C)/T

 

其中B表示单个法术在未产生致命一击时的伤害。C表示致命一击的几率,T表示单个法术的施法时间。

       现在我们可以计算初始情况下Liam的DPS期望值:

f1 = 1000*(1+10%)/3.5 =314.286

 

       假如Liam有200点“能力点”,并且他将20点转化为法术能量,30点转化为致命几率,150点转化为施法速度,那么他的DPS期望值就变成了

f2=1020*(1+11.5%)/(35/11)=357.437

 

       可见分配了“能力点”后LIAM的DPS有了很大提高,可是这样的分配方案显然不能最大化Liam的DPS,如果Liam将200点“能力点”全部转化为法术能量,那么他的DPS期望值就变成了

f3=1200*(1+10%)/3.5=377.143

 

       f3是能力点S=200时所能达到的最大DPS值,可是当S不等于200时呢?你能帮助他找到最优的分配方案,计算出最大化的DPS吗?(假设能力点可以拆分成非整数来分配)

Input

       第一行,一个正整数N,表示测试用例的数目

       第2到N+1行,每行一个正整数S(0 < S ≤ 10000),S表示Liam拥有的能力点数。

Output

       每个测试用例占一行,输出最大可能的DPS,保留小数点后3位有效数字。

Sample Input

2
200
3000

Sample Output

377.143
1610.346

题意:给出s,求非负实数x,y,z满足x+y+z=s且y<=1800
使得(x + 1000)*(y + 2200)*(z + 1500) / 10500000最大,输出这个最大值

代码:

#include<iostream>
#include<stdio.h>
using namespace std;

int main()
{
	int t, ss;
	cin >> t;
	while (t--)
	{
		scanf("%d", &ss);
		double x = 0, y = 0, z = 0, s = ss;
		if (s <= 500)x += s;
		else
		{
			s -= 500, x += 500;
			if (s <= 1400)x += s / 2, z += s / 2;
			else
			{
				s -= 1400, x += 700, z += 700;
				if (s <= 5400)x += s / 3, y += s / 3, z += s / 3;
				else s -= 5400, x += s / 2 + 1800, y += 1800, z += s / 2 + 1800;
			}
		}
		printf("%.3f\n", (x + 1000)*(y + 2200)*(z + 1500) / 10500000);
	}
	return 0;
}

阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页