前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「 互联网笔试题 」No.3答案与解析

「 互联网笔试题 」No.3答案与解析

作者头像
KEN DO EVERTHING
发布2019-01-17 16:10:20
5960
发布2019-01-17 16:10:20
举报
文章被收录于专栏:KEN DO EVERTHINGKEN DO EVERTHING

网易编程题

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

输入描述

对于每组数据,第一行是两个整数n(1≤n<100000)表示怪物的数量和a表示小易的初始能力值. 第二行n个整数,b1,b2…bn(1≤bi≤n)表示每个怪物的防御力

输出描述

对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值

输入例子

3 50 50 105 200 5 20 30 20 15 40 100

输出例子

110 205

解题思路:题目基本没什么难度,按照题目意思写程序,主要知道什么是最大公约数(最大公约数:指能够整除这些整数的最大整数)

参考答案:

代码语言:javascript
复制
public class WrittenQuestion3_1 {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()){
            //怪物数量
            int n = scanner.nextInt();
            //小易初始能力值
            int a= scanner.nextInt();
            //bi怪物能力值
            int[] b = new int[n];
            for(int i = 0;i<n;i++){
                b[i] = scanner.nextInt();
            }
            System.out.println(getResult(n, a, b));
        }
    }

    /**
     * 计算结果
     * @param n 怪物数量
     * @param c 小易当前能力值
     * @param b 怪物防御值
     * @return
     */
    private static int getResult(int n, int c, int[] b){
        for(int i =0; i < n; i++){
            //当前能力值大于等于怪物防御值
            if(c >= b[i]){
                c += b[i];
            }
            else { //当前能力值小于怪物防御值
                c += maxCommonDivisor(c, b[i]);
            }
        }
        return c;
    }


     //最大公约数
     public static int maxCommonDivisor(int m, int n) {
        if (m < n) {// 保证m>n,若m<n,则进行数据交换
            int temp = m;
            m = n;
            n = temp;
        }
        while (m % n != 0) {// 在余数不能为0时,进行循环
            int temp = m % n;
            m = n;
            n = temp;
        }
        return n;// 返回最大公约数
    }
}

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

输入描述

第一行9个整数,R,x1,y1,x2,y2,x3,y3,x0,y0.R代表炮台攻击的最大距离,(x1,y1),(x2,y2), (x3,y3)代表三个炮台的坐标.(x0,y0)代表敌人的坐标.

输出描述

输出一行,这一行代表敌人承受的最大伤害,(如果每个炮台都不能攻击到敌人,输出0×)

输入例子

1 1 1 2 2 3 3 1 2

输出例子

2x

解题思路:题目比较长,但也很简单,看懂题目就没问题。题给出了能攻击到的最大距离R,意思就是炮台距离敌人的距离小于等于R就能攻击到,题目中问题转换一下,就是求能攻击到敌人的炮台数量。(输出描述汇中表名,0个炮台攻击到敌人是0x.,以此类推一个是1x,2个是2x......)

参考答案:

代码语言:javascript
复制
public class WrittenQuestion3_2 {

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        //能攻击到敌人的距离R
        int R = scanner.nextInt();
        //炮台的位置
        Point point1 = new Point(scanner.nextInt(),scanner.nextInt());
        Point point2 = new Point(scanner.nextInt(),scanner.nextInt());
        Point point3 = new Point(scanner.nextInt(),scanner.nextInt());
        //敌人的位置
        Point point0 = new Point(scanner.nextInt(),scanner.nextInt());

        int count = 0;
        count += isAttack(R,getDistance(point1,point0)) ? 1 : 0;
        count += isAttack(R,getDistance(point2,point0)) ? 1 : 0;
        count += isAttack(R,getDistance(point3,point0)) ? 1 : 0;

        System.out.print(count+"x");
    }

    //计算两点间的距离
    private static double getDistance(Point point, Point point0){
        return Math.sqrt(Math.pow(point.getX()-point0.getX(),2)
                + Math.pow(point.getY()-point0.getY(),2));
    }

    //判断是否能攻击到敌人
    private  static boolean isAttack(int R, double getDistance){
        if(getDistance <= R){
            return true;
        }
        return false;
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java从心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档