网易2017校招编程题

Posted 翎飞蝶舞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网易2017校招编程题相关的知识,希望对你有一定的参考价值。

内推挂了,继续再战!

1、分苹果:

小易去买苹果,有两种包装,一种一袋8个,一种一袋6个,小易要买n个苹果(不能多也不能少),输出袋子最少的购买方案下的袋子,若无法正好买到n个,则输出-1。

 

解:设8个一袋的买了pack8袋,6个一袋的买了pack6袋。想要总袋子数最少,那么肯定优先买8个一袋的,最多能买n/8袋,先另pack8=n/8,计算该情况下,pack6为多少能满足总苹果数为6,若无法满足,则减少pack8的数量,直到可以满足总量为n。

 

#include<iostream>
using namespace std;
int main() {
    int n;
    cin>>n;
    int pack8=n/8;
    int pack6=0;
    for(pack8;pack8>=0;pack8--)
    {
        if((n-8*pack8)%6==0)
        {
            cout<<pack8+(n-8*pack8)/6<<endl;
            return 0;
        }
    }
    cout<<-1<<endl;
    return 0;
}

 

2、大数的最大奇约数

    用f(n)表示n的最大奇约数,输入一个数n,输出f(1)+f(2)+f(3)+...+f(n)。1<=n<=1000000000

 

解:说一下我的思路以及经过的一些曲折。当然第一个想到的方法就是暴力破解,用一个函数f(n),将n循环除2直到为奇数则返回,但是很明显,本题中n的取值范围很大,这样会超时。

     然后想着找规律,首先奇数的最大奇约数就是自己,可以暂时不考虑,最后用等差数列求和公式加进来就可以。对于偶数n来说,每个数都可以表示成2^k*i,其中i为奇数,则i就是它的最大奇约数,我们要做的就是把所有的i加进来。首先,我想到的是存储一下每个偶数ni对应的i,之后只要遍历n,找到对应的i加起来就可以了。既然用偶数n来作为遍历的基准会超时,那考虑从k和i出发。选用了map的数据结构,觉得可以方便查找,然后双层循环,第一层是k,第二层是i,边界条件为2^k*i<=n,将n作为key,i作为value存进map。然后又出现了新问题,map太大,超出内存限制。

     然后想到了,为什么要存起来呢,直接加进结果就可以了。设置一个count,来统计已经计算过的偶数数量,作为循环的终止条件。该方法的时间复杂度为O(n/2)。PS:开始只将结果定义为了Long型,发现测试用例只能通过一部分,后来想到中间结果也可能会溢出,都应该定义为long型。

#include <iostream>
using namespace std;

int main()
{
    long n;
    cin>>n;
    long long res=0;
    long t=2;//用t表示2^k
    int count=0;
    while(count<n/2)
    {
        for(long i=1;t*i<=n;i=i+2)//找到2^k*i<=n的所有i
        {
            res=res+i;
            count++;  
        }
        t=t*2;
    }
    if(n%2==0) //当n为奇数时,序列中的奇数和
    {
        res=res+n*n/4;            
    }
    else//当n为偶数时,序列中的奇数和
    {
        res=res+(n+1)*(n+1)/4;        
    }
    cout<<res<<endl;
    return 0;
}

 

以上是关于网易2017校招编程题的主要内容,如果未能解决你的问题,请参考以下文章

牛客网编程练习之网易2017校招题:下厨房

网易秋招校招编程题

[编程题] 相反数 网易2018校招

[编程题] 字符串碎片 网易2018校招

[编程题] 重排数列 网易2018校招

[编程题] 魔法币 网易2018校招