消灭终极BOSS-华为机试题

昨天参加了华为的机试,两个小时,三大题。

第一题很简单,长度为n的数组,将后m个数字移到前面,前面的n-m个数字移到后面,然后输出数组里面前m个、后m个数的和。

第二题是输入员工的姓名,若干次的打卡时间,输出打卡的状态(包括缺席、打卡不正常、早退、迟到、正常),以及工作时间。不难,只是情况比较多,所以做起来比较花费时间。

第一题、第二题花了太多不该花的时间(还是代码写太少),导致第三题当时没来得及好好做。过后思考了下,其实并不算难,只是要考虑几种情况。


第三题题目如下。(图偷来的,侵删)



思路如下:

首先计算出消灭BOSS需要多少轮,以及被BOSS消灭需要多少轮,如果挂之前能够消灭BOSS,则输出消灭BOSS的回合数,否则输出-1。


消灭BOSS回合数的计算步骤:

1.如果魔法量大于等于10,则发动魔法攻击,直到BOSS被灭或者魔法量不够。若BOSS被消灭,则不需执行下面步骤,已经得到回合数。

2.若剩余魔法量为6、7、8、9,则需要一轮魔法恢复则可进行魔法攻击,即两轮造成60点的伤害;普通攻击两轮只能造成34点伤害;因此当BOSS剩余HP大于34时,发动魔法攻击;

3.若剩余魔法量为2、3、4、5,则需要两轮轮魔法恢复则可进行魔法攻击,即三轮造成60点的伤害;普通攻击则三轮只能造成51点伤害;因此若此时BOSS剩余HP大于51时,发动魔法攻击。

4.五轮魔法恢复可以得到20点魔法量,可发动2轮魔法攻击,总共七回合,造成120点伤害;而普通攻击七回合造成119点伤害;因此,当BOSS的HP大于等于120时,使用5+2回合造成120点伤害。

3.BOSS的HP不足120点时,则发动普通攻击知道消灭BOSS即可。


代码如下:

#include<iostream>
using namespace std;
int main(){
	int HP1,MP,HP2;
	while(cin >> HP1 >> MP >> HP2){//输入
		//首先计算玩家最少多少轮能够将BOSS击败
		int killBoss = 0;
		//如果可以发动魔法攻击,则发动魔法攻击
		while(MP>=10 && HP2 > 0){
			HP2 -=60;
			MP -=10;
			++killBoss;
		}
		//若剩余魔法量为6、7、8、9,当BOSS剩余HP大于34时,发动魔法攻击;
		if(HP2 > 34 && MP >= 6){
			HP2 -= 60;
			killBoss += 2;
			MP += 4;
			MP -= 10;
		}
		//若剩余魔法量为2、3、4、5,BOSS剩余HP大于51时,发动魔法攻击。
		while(HP2 > 51 && MP >= 2){
			HP2 -= 60;
			killBoss += 3;
			MP += 2 * 4;
			MP -= 10;
		}
		//魔法值不够时,如果此时BOSS剩余血大于等于120,则5轮恢复魔法,2轮发起魔法进攻
		while(HP2 >=120){
			killBoss += 7;
			HP2 -= 120;
		}
		//剩余情况则普通攻击
		while(HP2>0){
			HP2 -= 17;
			++killBoss;
		}
		//计算多少轮被杀死
		int beKilled = 0;
		while(HP1 > 0){
			for(int i = 0;i < 4;++i){
				HP1 -= 10;
				++beKilled;
				if(HP1 <= 0) break;
			}
			if(HP1 >0){
				HP1 -= 30;
				++beKilled;
			}
		}
		//是否能消灭boss
		if(killBoss<=beKilled)
			cout << killBoss << endl;
		else
			cout << -1 << endl;
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值