网易2016研发工师编程题

小易的升级之路


小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3…bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?


#include <iostream>
#include <vector>
using namespace std;
int getMaxNum(int a,int b){//辗转相除
    if(a<b)  swap(a,b);
    int c;
    while(b){//结束条件
        c=a%b;
        a=b;
        b=c;
    }
    return a;
}
int getEndofB(vector<int> &b,int &n,int a){
    for(int i=0;i<n;++i){
        if(b[i]<=a){
            a+=b[i];
        }
        else{
            a+=getMaxNum(b[i],a);
        }

    }
    return a;
}


int main(){
    int n,a;
    while(cin>>n>>a){//测试数据格式
        vector<int> b(n);
        for(int i=0;i<n;++i){
            int bi;
            cin>>bi;
            b[i]=bi;
        }
        cout<<getEndofB(b,n,a)<<endl;
    }
    return 0;
}

炮台攻击


兰博教训提莫之后,然后和提莫讨论起约德尔人,谈起约德尔人,自然少不了一个人,那 就是黑默丁格——约德尔人历史上最伟大的科学家. 提莫说,黑默丁格最近在思考一个问题:黑默丁格有三个炮台,炮台能攻击到距离它R的敌人 (两点之间的距离为两点连续的距离,例如(3,0),(0,4)之间的距离是5),如果一个炮台能攻击 到敌人,那么就会对敌人造成1×的伤害.黑默丁格将三个炮台放在N*M方格中的点上,并且给出敌人 的坐标. 问:那么敌人受到伤害会是多大?


#include <iostream>
using namespace std;
int getMaxHurt(int &r,int &x1,int &y1,int &x2,int &y2,int &x3,int &y3,int &x0,int &y0){
    int i=0;
    r*=r;
    if(r>=(x1-x0)*(x1-x0)+(y1-y0)*(y1-y0))   ++i;
    if(r>=(x2-x0)*(x2-x0)+(y2-y0)*(y2-y0))   ++i;
    if(r>=(x3-x0)*(x3-x0)+(y3-y0)*(y3-y0))   ++i;
    return i;
}

int main(){
    int r,x1,y1,x2,y2,x3,y3,x0,y0;
    while(cin>>r>>x1>>y1>>x2>>y2>>x3>>y3>>x0>>y0){
        cout<<getMaxHurt(r,x1,y1,x2,y2,x3,y3,x0,y0)<<"x"<<endl;
    }
    return 0;
}

扫描透镜


在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只 有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇?
注意:每个方格被扫描一次只能清除掉一个蘑菇。


前两题很容易,这一题其实也比较好做,就是题目不容易读懂,测试修改很久,才AC,仍旧对题意不甚理解。
1、对坐标数据传入 cin>>v0[0]>>v0[1];v[i]=(v0);就好了,不要错误的加在while中,这样会导致数据错误。
2、对于第一次扫描,我们很容易得到结果。但是第二次该怎么做呢。
3、第二次:将已经清除掉的蘑菇-1,然后再按照第一次寻找3*3最大的方式,在个数大于0的前提下找出最多蘑菇数。
4、相加返回。
注意点,由于容器比较混杂,可能会有迭代器对应错误情况,需要仔细审查。


#include <iostream>
#include <vector>
#include <map>
using namespace std;
int canClean(int n,int m,int k,vector<vector<int>> v){
    vector<map<vector<int>,int>> vsv;
    for(int j=1;j<=m;++j){
        for(int i=1;i<=n;++i){
            map<vector<int>,int> mv;
            for(const vector<int> v0:v){
                if(v0[0]>=i&&v0[0]<=i+2&&v0[1]>=j&&v0[1]<=j+2){
                    ++mv[v0];
                } 

            }
            vsv.push_back(mv);
        }
    }
    vector<map<vector<int>,int>>::iterator maxiter=vsv.begin();
    int maxsz=0;
    for(const auto &mvi:(*maxiter)){
        ++maxsz;
    }
    for(auto iter=vsv.begin();iter!=vsv.end();++iter){
        int sz=0;
        for(const auto &mvi:(*iter)){
            ++sz;
        }
        if(sz>maxsz){
            maxsz=sz;
            maxiter=iter;
        }
    }
    map<vector<int>,int>::iterator p;
    for(auto &mp:(*maxiter)){
        for(auto iter=vsv.begin();iter!=vsv.end();++iter){
            if((p=iter->find(mp.first))!=iter->end())
                    --p->second;
        }
    }

    vector<map<vector<int>,int>>::iterator maxiter1;
    int maxsz1=0;
    for(auto iter=vsv.begin();iter!=vsv.end();++iter){
        int sz=0;
        for(const auto &mvi:(*iter)){
            if(mvi.second>0) ++sz;
        }
        if(sz>maxsz1){
            maxsz1=sz;
            maxiter1=iter;
        }
    }

    return maxsz+maxsz1;
}
int main(){
    int n,m,k;
    while(cin>>n>>m>>k){
        vector<vector<int>> v(k);
        vector<int> v0(2);
        for(int i=0;i<k;++i){
            cin>>v0[0]>>v0[1];
            v[i]=(v0);
        }
        cout<<canClean(n,m,k,v)<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值