网易游戏开发岗笔试(2020.9.5 15:00-17:30)
昨天的笔试,做得挺难受的,当时正在搬寝室,很吵,然后保洁阿姨来打扫寝室卫生…
2.5小时,4道编程题,每道题100分。 1, 0.2 0 0.1 ,第2题应该就是模拟,说我TLE,第三题bfs,说段错误,不知道map哪里来的段错误…, 第四题就5分钟了,想到了思路,细节除了点问题,敲完就交了,剩下几秒钟结束,过了10%,j++写成了i++…
第一题:自动贩卖机
题意:
模拟一个自动贩卖机。贩卖机有n个货物口,每个货口初始都放了无限多的相同的货物,货物的单价为a[i], 每个人通过手机扫码可以打开贩卖机的门,拿东西,然后关上门之后,贩卖机会自动扣费。现在让你实现这个计费功能。
每个人可以从x号货物口拿一个货物到左手或者右手上,记为take left x 或者 take right x。可以把左手或者右手的货物放到y号货物口,记为return left y 或者 return right y。还可以把左手或者右手上拿的货物装进背包里。记为keep left 或 keep right。
货物口的货物满足后进先出的原则。T组输入,T<=100, 每组输入第一行一个K(K<=100),代表这个人的操作的个数,下面是K行,每行一个命令,命令有如下:
take left x(数字)
take right x(数字)
return left x
return right x
keep left
keep right
每个人输出一行,输出他要付的钱。
分析:每个货物口用一个栈模拟,记录这个人当前左手和右手的货物编号,模拟即可。(其实不用一开始每个都push 10000个货物模拟OO,只要在取货的时候,判断如果栈空了,就取一个a[i]即可)
%100 AC
#include <bits/stdc++.h>
using namespace std;
const int N = 200;
stack<int> st[N];
int price[N];
char hand[100],op[100];
int main(void) {
int n,m,k,id;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) {
scanf("%d",price+i);
for(int j=1;j<=10001;++j)
st[i].push(price[i]);
}
for(int i=1;i<=m;++i) {
scanf("%d",&k);
int man[2] = {
0};
int hands = -1;
man[0] = man[1] = 0;
int tot = 0;
while(k--) {
scanf("%s%s",hand,op);
if(strcmp("keep",op)!=0) scanf("%d",&id);
if(strcmp(hand,"left")==0) hands = 0;
else hands = 1;
if(strcmp(op,"take")==0) {
man[hands] = st[id].top();
st[id].pop();
}
else if(strcmp(op,"return")==0) {
st[id].push(man[hands]);
man[hands] = -1;
}
else {
tot += man[hands];
man[hands] = -1;
}
}
if(man[0]!=-1) tot+=man[0];
if(man[1]!=-1) tot+=man[1];
printf("%d\n",tot);
}
return 0;
}
第2题,计算电子显示器的刷新次数
题意:
一个h*w的显示器,要在上面显示一个图像平移的动画。图像大小为q*p。(1<=p,q,h,w<=100)。 在显示器上面显示背景,然后图像要覆盖背景。图像开始的时候左上角的位置在(stx,sty)(可能是负数)每次图像向右移动dy,向左移动dx,屏幕的每个单元格,如果和上次的字符不一样,就需要刷新。问最少刷新几次?
T组输入,保证dx和dy不同时为0。