2016网易研发题目

前段时间做的,现在整理一下,方便以后复习!

//小易经常沉迷于网络游戏.有一次, 他在玩一个打怪升级的游戏, 他的角色的初始能力值为 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)表示每个怪物的防御力
//
//
// 输出描述 :
//对于每组数据, 输出一行.每行仅包含一个整数, 表示小易的最终能力值

#include<iostream>
#include<vector>
using namespace std;
int gcd(int x, int y)
{
    if (y==0)
    {
        return 0;
    }
    if (x<y)
    {
        int temp = x;
        x = y;
        y = temp;
    }
    while (y)  //注意方法
    {
        int temp = y;
        y = x%y;
        x = temp;
    }
    return x;
}
int main()
{
    int monsterNumber = 0, initAbility = 0;
    //vector<int> monster;
    while (cin>>monsterNumber>>initAbility)
    {
        int monsterDefence;
        for (size_t i = 0; i < monsterNumber; i++)
        {
            cin >> monsterDefence;
        //    monster.push_back(monsterDefence);
            if (initAbility>=monsterDefence)
            {
                initAbility += monsterDefence;
            }
            else
            {
                initAbility += gcd(initAbility,monsterDefence);
            }
        }
        cout << initAbility << endl;
    }
    return 0;
}

//
//兰博教训提莫之后, 然后和提莫讨论起约德尔人, 谈起约德尔人, 自然少不了一个人, 那 就是黑默丁格------约德尔人历史上最伟大的科学家.提莫说,
//黑默丁格最近在思考一个问题:黑默丁格有三个炮台, 炮台能攻击到距离它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×)

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int r, x[4], y[4],result; //  //赋值放在外面通不过
    while (cin>>r)
    {
        result = 0;
        for (size_t i = 0; i < 4; i++)
        {
            cin >> x[i];
            cin >> y[i];
        }
        for (size_t i = 0; i < 3; i++)
        {
            if (sqrt((x[i] - x[3])*(x[i] - x[3]) + (y[i] - y[3])*(y[i] - y[3]))<=r)
            {
                result++;
            }
        }
        cout << result << "x" << endl;
    }

    return 0;
}

//在N*M的草地上, 提莫种了K个蘑菇, 蘑菇爆炸的威力极大, 兰博不想贸然去闯, 而且蘑菇是隐形的.只
//有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇, 于是他回了一趟战争学院, 买了2个扫描透镜, 一个
//扫描透镜可以扫描出(3 * 3)方格中所有的蘑菇, 然后兰博就可以清理掉一些隐形的蘑菇.问:兰博最多可以清理多少个蘑菇 ?
//
//输入描述 :
//第一行三个整数 : N, M, K, (1≤N, M≤20, K≤100), N, M代表了草地的大小;
//接下来K行, 每行两个整数x, y(1≤x≤N, 1≤y≤M).代表(x, y)处提莫种了一个蘑菇.
//一个方格可以种无穷个蘑菇.
//
//输出描述:
//输出一行, 在这一行输出一个整数, 代表兰博最多可以清理多少个蘑菇.

//解析一下这道题的已知的条件:
//
//草地大小为N*M——二维数组为N*M
//一个方格可以有多个蘑菇——数组元素的值在[0, K]区间内
//透镜检查范围为3 * 3——每次检查3 * 3的方格有多少蘑菇
//两个透镜——扫描两次,且有先后问题(下面详解)
//故这道题的解答方法如下:
//(1)读入数据N,M,K
//(2)初始化土地
//(3)使用第一块透镜扫描土地第一个3 * 3方格,并且将该方格的所有蘑菇数减1(空的不减),同时记录采集的蘑菇数mushroom1
//(4)在第(3)步的基础上,使用第二块透镜扫描土地的所有个3 * 3方格,每扫描完一个3 * 3方格,记录当前方格的蘑菇数mushroom2,注意不用再减1,计算当前mushroom1 + mushroom2    //但是不知道为什么
//(5)重复(3)(4),直到使用第一块透镜扫描完所有的土地
//(6)输出mushroom1 + mushroom2的最大值
//

//问最多可清理多少个蘑菇就是求二维数组中哪一块(3 * 3)区域中的蘑菇数最多。
//有两个透镜,那么最多可清理的蘑菇数就是第一个透镜最多清理的加上第二个透镜
//最多清理的(将求最多清理蘑菇数写成函数)。
//需要注意的是对于每个方格如果其中有多个蘑菇那么一次扫描只能清理掉一个蘑菇。
//这要求我们在求出第一个最优解后要对二维数组中的相应方格中的蘑菇数进行减1操作。
//注意:第一块透镜和第二块透镜扫描的3 * 3方格之间没有任何关系,且透镜只能知道该方格有没有蘑菇,而不知道有几块蘑菇
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    //input data
    int n, m, k;
    while (cin >> n >> m >> k){
        if (n < 3) n = 3;
        if (m < 3) m = 3;
        //initialize ground
        vector<vector<int> > ground(n, vector<int>(m, 0)); //n*m的二维vector,所有元素为0
        for (int i = 0; i<k; i++){
            int x, y;
            cin >> x >> y;
            ground[--x][--y]++;
        }

        int mushroomNum(0), mushroom1, mushroom2;
        //first scan
        for (int i = 0; i<n - 2; i++)
        for (int j = 0; j<m - 2; j++)
        {
            mushroom1 = 0;
            vector<vector<int> > groundNew = ground;//copy
            for (int row = i; row<i + 3; row++)
            for (int col = j; col<j + 3; col++)
            if (groundNew[row][col] > 0){
                groundNew[row][col]--;  //当前方格减一
                mushroom1++; //可清理的蘑菇数
            }
            //second scan
            for (int i = 0; i<n - 2; i++)
            for (int j = 0; j<m - 2; j++)
            {
                mushroom2 = 0;
                for (int row = i; row<i + 3; row++)
                for (int col = j; col<j + 3; col++)
                if (groundNew[row][col] > 0)
                    mushroom2++;
                if (mushroomNum < mushroom1 + mushroom2)
                    mushroomNum = mushroom1 + mushroom2;
            }
        }
        cout << mushroomNum << endl;
    }
    return 0;
}
时间: 2024-10-10 07:00:08

2016网易研发题目的相关文章

DP - 2016网易杭研笔试题A

2016网易杭研笔试题A Problem's Link ---------------------------------------------------------------------------- Mean: 有一个边长为n的立方体,内部的每一个小立方体内有一个数字.如果取了当前这个小立方体,则小立方体的: 1.上下相邻两层将会消失; 2.前后相邻两列将会消失; 3.左右相邻两个将会消失; 找出一种取法,使得取到的数的sum最大,输出sum. analyse: 现场面试时挂在这题上了

华为2016机试题目01

牛客网做的华为2016机试题目,新手,代码较乱,一起讨论. 题目要求如下: 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据. 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目. 学生ID编号从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩 接下来又M行,每一行有一

比较重量 网易2016实习研发工程师编程题

题目: 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第 二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入数据保证合 法,不

网易 2016 实习研发project师 3道 编程题

1 比較重量 给定两颗钻石的编号g1,g2,编号从1開始.同一时候给定关系数组vector,当中元素为一些二元组.第一个元素为一次比較中较重的钻石的编号,第二个元素为较轻的钻石的编号.最后给定之前的比較次数n. 请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法推断返回0. 输入数据保证合法,不会有矛盾情况出现. 測试例子: 2,3,[[1,2],[2,4],[1,3],[4,3]],4 返回: 1 class Cmp { public: int cmp(int g1, int g

网易 2016 实习研发工程师 3道 编程题-2

有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离.二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离. 给定二叉树的根节点root,请返回所求距离. //import java.util.ArrayList;   //import java.util.HashMap;   //import java.util.Iterator;   //import java.util.LinkedList;   //imp

网易 2016 实习研发工程师 3道 编程题-1

小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入数据保证合法,不会有矛盾情况

网易2016实习研发工程师编程题

牛客网上的题 1 比较重量 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入

网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array

传送门 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2],5,3 返回:2 note: 注意手写快排的时候: while(i < j) { while(j > i && a[j] > a[left]) j--; while(i < j && a[i] <= a[left]) i++; if(i

寻找第K大 网易2016实习研发工程师编程题

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2],5,3 返回:2 投机取巧能通过: 1 class Finder { 2 public: 3 int findKth(vector<int> a, int n, int K) { 4 // write code here 5 sort(a.begin(), a.end()); 6 return