网易笔试编程题讲解.docx
- 文档编号:3737241
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:11
- 大小:19.20KB
网易笔试编程题讲解.docx
《网易笔试编程题讲解.docx》由会员分享,可在线阅读,更多相关《网易笔试编程题讲解.docx(11页珍藏版)》请在冰豆网上搜索。
网易笔试编程题讲解
[编程题]小易的升级之路
小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为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)表示每个怪物的防御力
输出描述:
对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值
输入例子:
350
50105200
520
30201540100
输出例子:
110
205
#include
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
/*
intgcd(intm,intn)
{
returnn==0?
m:
gcd(n,m%n);
}*/
intgcd(inta,intb)
{
if(!
b)returna;
returngcd(b,a%b);
}
intmain()
{
intn,ack,ans;
while(scanf("%d%d",&n,&ack)!
=EOF)
{
while(n--)
{
scanf("%d",&ans);
if(ans>ack)
ack+=gcd(ack,ans);
elseack+=ans;
}
printf("%d\n",ack);
}
return0;
}
[编程题]炮台攻击
兰博教训提莫之后,然后和提莫讨论起约德尔人,谈起约德尔人,自然少不了一个人,那就是黑默丁格------约德尔人历史上最伟大的科学家.提莫说,黑默丁格最近在思考一个问题:
黑默丁格有三个炮台,炮台能攻击到距离它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×)
输入例子:
111223312
输出例子:
2x
#include
#include
#include
usingnamespacestd;
structPoint
{
intx,y;
Point(intx=0,inty=0):
x(x),y(y){}//构造函数,方便代码编写
Point(Point&a):
x(a.x),y(a.y){}
};
inlineintDistance(PointA,PointB)
{
return(A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);
}
intmain()
{
intR;
PointA,B,C,P;
while(scanf("%d%d%d%d%d%d%d%d%d",&R,&A.x,&A.y,&B.x,&B.y,&C.x,&C.y,&P.x,&P.y)!
=EOF)
{
intsum=0;
R*=R;
if(Distance(A,P)<=R)sum++;
if(Distance(B,P)<=R)sum++;
if(Distance(C,P)<=R)sum++;
printf("%dx\n",sum);
}
return0;
}
//111223312
[编程题]扫描透镜
在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)处提莫种了一个蘑菇.
一个方格可以种无穷个蘑菇.
输出描述:
输出一行,在这一行输出一个整数,代表兰博最多可以清理多少个蘑菇.
#include
#include
#include
#include
usingnamespacestd;
intm[25][25];
intvis1[25][25];
intvis2[25][25];
intd[9][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,0},{0,1},{1,-1},{1,0},{1,1}};
inlinevoidsum_map(intx,inty)
{
for(inti=0;i<9;i++)
{
if(m[x+d[i][0]][y+d[i][1]]>0)vis1[x][y]++;
if(m[x+d[i][0]][y+d[i][1]]>1)vis2[x][y]++;
}
}
inlineintsd_sum(intx,inty,inti,intj)
{
if(x==i&&y==j)returnvis2[i][j];
elseif(i>=x-2&&i<=x+2&&j>=y-2&&j<=y+2)
{
inttmp=0;
for(intk=0;k<9;k++)
{
intxi=i+d[k][0];
intyi=j+d[k][1];
if(xi>=x-1&&xi<=x+1&&yi>=y-1&&yi<=y+1)
{
if(m[xi][yi]>1)tmp++;
}
else
{
if(m[xi][yi]>0)tmp++;
}
}//controlmayreachendofnon-voidfunction[-Werror,-Wreturn-type]
returntmp;//得知原因是自己定义了一个有返回值的函数,而函数结尾却没有返回值;
}
elsereturnvis1[i][j];
}
intmain()
{
intN,M,K;
while(scanf("%d%d%d",&N,&M,&K)!
=EOF)
{
intx,y;
memset(m,0,sizeof(m));
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
for(inti=0;i { scanf("%d%d",&x,&y); m[x][y]++; } for(inti=1;i<=N;i++)//打表 { for(intj=1;j<=M;j++) { sum_map(i,j); } } intmmax=0; for(inti=0;i<=N;i++) { for(intj=0;j<=M;j++) { for(intii=0;ii<=N;ii++) { for(intjj=0;jj<=M;jj++) { mmax=max(vis1[i][j]+sd_sum(i,j,ii,jj),mmax); } } } } printf("%d\n",mmax); } return0; } 题目来源: 牛客网-网易2016年研发工程师编程题二。 1.奖学金 小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg。 每门课由平时成绩和考试成绩组成,满分为r。 现在他知道每门课的平时成绩为ai,若想让这门课的考试成绩多拿一分的话,小v要花bi的时间复习,不复习的话当然就是0分。 同时我们显然可以发现复习得再多也不会拿到超过满分的分数。 为了拿到奖学金,小v至少要花多少时间复习。 输入描述: 第一行三个整数n,r,avg(n大于等于1小于等于1e5,r大于等于1小于等于1e9,avg大于等于1小于等于1e6),接下来n行,每行两个整数ai和bi,均小于等于1e6大于等于1 输出描述: 一行输出答案。 输入例子: 5109 05 91 81 01 9100 输出例子: 43 分析: 完成这个题目需要注意两个问题: (1)求出最少复习时间,需要优先选择每分的复习时间最小的课程,那么需要对<平时成绩,复习时间>元素对按复习时间递增进行排序; (2)因为课程数很多,每分复习时间很大,所需最小复习时间需要长整型来存储,以防溢出; (3)如果所需复习时间小于等于0,需要特殊处理。 测试通过源码: #include #include #include usingnamespacestd; boolcompare(constvector { returnvec0[1] } intmain(intargc,char*argv[]){ intcourseNum=0,maxScore=0,average=0; while(cin>>courseNum>>maxScore>>average){ vector intregularGradeSum=0;//平时总分 for(inti=0;i cin>>regularGrade_effort[i][0]>>regularGrade_effort[i][1]; regularGradeSum+=regularGrade_effort[i][0]; } sort(regularGrade_effort.begin(),regularGrade_effort.end(),compare);//按每分的复习时间升序排列 longlongintminimumTime=0;//因为每分的复习时间很大,需要长整型,否则溢出,不能通过测试 intneedScore=courseNum*average-regularGradeSum; if(needScore<=0) gotoend; for(inti=0;i for(intj=0;j --needScore; minimumTime+=regularGrade_effort[i][1]; if(needScore==0) gotoend; } } end: cout< } } 2.路灯 一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为ai,每盏灯可以覆盖到的最远距离为d,为了照明需求,所有灯的灯光必须覆盖整条街,但是为了省电,要求这个d最小,请找到这个最小的d。 输入描述: 每组数据第一行两个整数n和l(n大于0小于等于1000,l小于等于1000000000大于0)。 第二行有n个整数(均大于等于0小于等于l),为每盏灯的坐标,多个路灯可以在同一点。 输出描述: 输出答案,保留两位小数。 输入例子: 715 155379140 输出例子: 2.5 分析: (1)问题的实质是求一个数组序列中的两个连续元素之间的最大差值,还需要考虑首尾的特殊性; (2)我为了练习set集合容器,所以使用了set来存储路灯位置,当然你也可以使用vector容器。 相对于vector容器,其好处是元素不重复,自动排序,劣势就是迭代器不支持算术加减操作,只支持自增++和自减–操作。 测试通过的源码: #include #include #include usingnamespacestd; intmain(intargc,char*argv[]){ intn=0,l=0; set while(cin>>n>>l){ intpos=0; for(inti=0;i cin>>pos; lampPos.insert(pos); } intmaxDistance=0; for(set : iteratorit=lampPos.begin();it! =--lampPos.end();++it){ set : iteratornextIt=++it; --it; if((*nextIt-*it)>maxDistance) maxDistance=*nextIt-*it; } floatd=(float)maxDistance/2; //考虑第一个路灯到路的开始位置 if(*lampPos.begin()>d) d=*lampPos.begin(); //考虑最后一个路灯到路的结束 if(l-*(--lampPos.end())>d) d=l-*(--lampPos.end()); lampPos.clear(); cout< : fixed)< (2)< } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网易 笔试 编程 讲解