网易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校招编程题的主要内容,如果未能解决你的问题,请参考以下文章