昨天参加了华为的机试,两个小时,三大题。
第一题很简单,长度为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;
}