欢迎访问yhm138的博客园博客, 你可以通过 [RSS] 的方式持续关注博客更新

MyAvatar

yhm138

HelloWorld!

编程练习 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;
}
posted @ 2021-03-10 19:58  yhm138  阅读(236)  评论(0编辑  收藏  举报