原文链接http://www.cnblogs.com/njczy2010/p/4378596.html
“亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 k题
题目都放代码里了,
今天看了下别人做的,真是精简啊= =
上代码:
/*法师
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 175 测试通过 : 30
题目描述
说到法师,也许大家第一反应便是脆弱的身躯与强大的爆发能力。诚然如此,在《炉石传说》中,法师拥有着最高伤害的单体法术——炎爆术,同时还有同样高伤害的火球术。但法师并不仅限于此,如果说这两张火系法术代表着的是法师的爆发。那么冰系法术就代表了法师的控制,冰霜新星、冰锥术以及暴风雪和寒冰箭都能够使对手冻结。
每张卡牌能造成一定的伤害,同时也要花费一定的法力水晶。当法力水晶不够的时候,你便不能打出相应的卡牌。
为了简单起见,我们只考虑以下几张卡牌。
寒冰箭 :消耗2点法力水晶,对一个角色造成3点伤害,并使其冻结。
冰枪术:消耗1点法力水晶,使一个角色冻结,如果它已经被冻结,则改为对其造成4点伤害。
火球术:消耗4点法力水晶,造成6点伤害。
炎爆术:消耗10点法力水晶,造成10点伤害。
现在,告诉你现在拥有的法力水晶,以及手上拥有的这四种卡牌的数目(可能为0),问你能对敌方英雄造成多少点伤害。
输入
第一行为一个正整数T,表示有T组数据。
每组数据第一行有1个整数: n表示当前拥有的法力水晶个数0<=n<=10。
第二行为四个整数a,b,c,d分别表示拥有寒冰箭、冰枪术、火球术、炎爆术的数目。0<=a,b,c,d<=10.
输出
一个整数表示最大可能造成的伤害值。
样例输入
2
9
0 0 3 0
5
2 2 1 1
样例输出
12
11
题目来源
NUPT
题意:
告诉你现在拥有的法力水晶(n),以及手上拥有的这四种卡牌的数目(可能为0),问你能对敌方英雄造成多少点伤害。
ps:冰冻的特效是一旦冰冻就会一直冰冻。
题解:
1.想作为一道水题的,不想为难大家,所以数据范围均<=10,直接四重循环暴力即可,最后判断一下关于冰冻的事情。(如果没有寒冰箭的话,要先浪费一个冰枪术)
2.如果数据范围比较大的话,暴力就会TLE,这时候,可以考虑先用背包的思路(动态规划的一种),将火球术和炎爆术进行预处理。
得到dp[i],表示使用了i点法力水晶,可以造成的最大伤害,在此基础上,考虑寒冰箭与冰枪术了。
2.1 如果剩余法力水晶充足,一起加上。
2.2 如果剩余法力不足,分为两种情况:使用寒冰箭与不使用寒冰箭。
2.2.1 不使用寒冰箭,把冰枪术的伤害加上即可。
2.2.2 使用寒冰箭,那么先拿出一张寒冰箭,然后优先用冰枪术(不涉及到冰冻问题,冰枪术的性价比要高),然后再加上寒冰箭。
标程:
这里先给出暴力法的标程,有兴趣的同学可以尝试一下,如果数据比较大(1<=n,a,b,c,d<=100000)的情况,如何用上述方法解决。
*/
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int a, b, c, d, n;
scanf("%d", &n);
scanf("%d %d %d %d", &a, &b, &c, &d);
int ans = 0;
for(int i = 0; i <= a; i++)
{
for(int j = 0; j <= b; j++)
{
for(int k = 0; k <= c; k++)
{
for(int l = 0; l <= d; l++)
{
if(2 * i + 1 * j + 4 * k + 10 * l <= n)
{
if(i > 0) //用寒冰箭冰冻
ans = max(ans, 3 * i + 4 * j + 6 * k + 10 * l);
else
{
if(j >= 1) //用冰枪术冰冻
ans = max(ans, 4 * (j - 1) + 6 * k + 10 * l);
else
ans = max(ans, 6 * k + 10 * l);
}
}
}
}
}
}
printf("%d\n", ans);
}
}