编程练习 vivo 2020届校招在线编程笔试B卷
试题地址
https://www.nowcoder.com/test/20555525/summary
解答
1
小v最近在玩一款挖矿的游戏,该游戏介绍如下:
1、每次可以挖到多个矿石,每个矿石的重量都不一样,挖矿结束后需要通过一款平衡矿车运送下山;
2、平衡矿车有左右2个车厢,中间只有1个车轮沿着导轨滑到山下,且矿车只有在2个车厢重量完全相等且矿石数量相差不超过1个的情况下才能成功运送矿石,否则在转弯时可能出现侧翻。
假设小v挖到了n(n<100)个矿石,每个矿石重量不超过100,为了确保一次性将n个矿石都运送出去,一旦矿车的车厢重量不一样就需要购买配重砝码。请问小v每次最少需要购买多少重量的砝码呢? (假设车厢足够放下这些矿石和砝码,砝码重量任选)
//思路:dp,背包
//顺便一提,我在洛谷做过情境和这比较像的一道dp题 https://www.luogu.com.cn/problem/P1282
2
今年7月份vivo迎来了新入职的大学生,现在需要为每个新同事分配一个工号。人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:
将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;
最后按照出列顺序为每个人依次分配工号。请你使用自己擅长的编程语言帮助小v实现此方法。
//思路:裸的Jorseph环问题,方案不要太多。建议至少背会一种,而不是像我一样找了个板子改代码
//
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
/**
* Welcome to vivo !
*/
#define JoesphProblemSolver JPS
int JPS (int n,int m,int i)
{
if(i==1)
return (n+m-1)%n;
else
return (JPS(n-1,m,i-1)+m)%n;
}
typedef struct _node
{
int num;
struct _node * next;
}node;
void solution(int N, int M)
{
// TODO Write your code here
//总数N,每次多长M,从K开始
int K=0;
for(int i=1;i<=N;i++)
{
if(i==1) ;else cout<<" ";
cout<<(JPS(N,M,i)+K)%N+1;//第i次出环
}
cout<<endl;
}
int main()
{
int N;
int M;
string str("");
getline(cin, str);
char *p;
const char* strs = str.c_str();
p = strtok((char *)strs, " ");
N = atoi(p);
p = strtok(NULL, " ");
M = atoi(p);
solution(N, M);
return 0;
}
3
小v在公司负责游戏运营,今天收到一款申请新上架的游戏“跳一跳”,为了确保提供给广大玩家朋友们的游戏都是高品质的,按照运营流程小v必须对新游戏进行全方位了解体验和评估。这款游戏的规则如下:
有n个盒子排成了一行,每个盒子上面有一个数字a[i],表示在该盒子上的人最多能向右移动a[i]个盒子(比如当前所在盒子上的数字是3,则表示可以一次向右前进1个盒子,2个盒子或者3个盒子)。
现在小v从左边第一个盒子上开始体验游戏,请问最少需要移动几次能到最后一个盒子上?
//dp,我这里没做dp的优化
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define INF 0x3f3f3f3f
/**
* Welcome to vivo !
*/
int solution(int a[], int N)
{
// TODO Write your code here
int dp[N+10];
memset(dp,INF,sizeof(dp));
dp[0]=0;
for(int i=0;i<N;i++){
for(int j=1;j<=a[i]&&i+j<=N-1;j++){
dp[i+j]=min(dp[i+j],dp[i]+1);
}
}
if(dp[N-1]==INF) return -1;
else return dp[N-1];
}
int main()
{
string str("");
getline(cin, str);
int a[2000];
int i = 0;
char *p;
int count = 0;
const char* strs = str.c_str();
p = strtok((char *)strs, " ");
while(p)
{
a[i] = atoi(p);
count++;
p = strtok(NULL, " ");
i++;
if(i >= 2000)
break;
}
int num = solution(a, count);
cout << num << endl;
return 0;
}