2017完美世界研发部笔试题_取经

完美世界2017c++游戏开发:笔试题+面试题 现场笔试题 阅读详情

一、题目概述

师徒四人西天取经,途中必需跨过一座桥,四个人从桥的同一端出发,你得帮助他们到达另一端,天色很暗而他们只有一支手电筒,一次同时最多可以有两个人一起经过桥。而过桥的时候必须持有手电筒,所以就得有人把手电筒带来带去,来回桥两端。手电筒不能用丢的方式来传递,四个人的步行速度各不同,若两人同行则以较慢者的速度为准,大师兄需花1分钟过桥,二师兄需花2分钟过桥,三师兄需花5分钟过桥,师傅需花10分钟过桥。请问他们最短在多少分钟内过桥?()
A. 18
B. 17
C. 19
D. 16


二、思路

一开始直接想到,用最小的那个数来回跑,也就是大师兄来回跑,算出来是19,可是又想了下,如下:
1、大师兄和二师兄过桥,算二师兄的时间也就是2分钟
2、大师兄独自拿手电回来 1分钟
3、三师弟和师傅那手电过桥,算师傅的时间也就是10分钟
4、二师弟拿手电回来 2分钟
5、最后大师兄和二师弟过桥 2分钟
总共17分钟

这里写图片描述

虽然结果出来了,感觉有点不实在,这其中的规律是怎样的呢?有没有什么规律解决这类似的问题呢,比如只有三个人过桥呢?二师兄不过桥,结果又是什么呢?再比如,多一个人过桥呢?多了个白龙马过桥,白龙马过桥的时间时6分钟,结果又是什么呢?有没有什么规律呢,或者说有没有个公式来计算呢?用编程怎么解?

求教大神?先睡了,尝试下编程解决!


三、编程解决

2016年10月7日01:39:55
本来当时写博客的第二天就用编程解决了这个问题的,可是因为种种原因,还没有时间把代码贴上来!

import java.util.ArrayList;

public class Pilgrimage {

    final static int times[] = { 1, 2, 5, 10 };// 花费时间
    final static String names[] = { "大师兄", "二师兄", "三师兄", "师傅" };// 人物

    public static void main(String[] args) {
        Integer other_bridges[] = { 0, 0, 0, 0 };// 桥另一边
        Integer bridges[] = { 1, 1, 1, 1 };// 当前桥这边 ,1表示存在,0表示不在

        // 开始递归
        loop(bridges, other_bridges, 0, new StringBuffer());
    }

    private static void loop(Integer[] bridges, Integer[] other_bridges,
            int time, StringBuffer msg) {
        ArrayList<Integer> positions = new ArrayList<Integer>();// 记录还在起始端人的下标
        for (int i = 0; i < bridges.length; i++) {
            if (bridges[i] == 1) {
                positions.add(i);// 记录下标
            }
        }
        int len = positions.size();

        for (int i = 0; i < len - 1; i++) {
            for (int j = i + 1; j < len; j++) { // 循环取结合
                // 记录状态
                Integer[] zt_bridges = bridges.clone();
                Integer[] zt_other_bridges = other_bridges.clone();
                int zt_time = time;
                StringBuffer zt_msg = new StringBuffer(msg);

                // 过桥---------
                time += times[positions.get(j)];// 花费时间直接取最大的
                move(bridges, other_bridges, 1, positions.get(i));
                move(bridges, other_bridges, 1, positions.get(j));
                msg.append(" 过桥:" + names[positions.get(i)] + "&"
                        + names[positions.get(j)]);
                // System.out.print(" 过桥:" + names[positions.get(i)] + "_"
                // + names[positions.get(j)]);

                // 回来接人------
                if (isend(other_bridges)) {
                    msg.append(" 总共花费:" + time);
                    System.out.println(msg.toString());
                    // System.out.println(" 总共花费:" + time);
                    return;
                }
                int k = 0;
                for (int ii = 0; ii < other_bridges.length; ii++) {// 选择最快的回来
                    if (other_bridges[ii] == 1) {
                        k = ii;
                        break;
                    }
                }
                time += times[k];
                move(bridges, other_bridges, 0, k);
                msg.append("  回来:" + names[k]+"  ***  ");
                // System.out.print(" 回来:" + names[k]);

                // 继续循环遍历
                loop(bridges.clone(), other_bridges.clone(), time,
                        new StringBuffer(msg));

                // 还原状态
                bridges = zt_bridges;
                other_bridges = zt_other_bridges;
                time = zt_time;
                msg = zt_msg;
            }
        }
    }

    /**
     * 移动的那个人
     * 
     * @param bridges
     * @param other_bridges
     * @param direction
     *            方向
     * @param position
     */
    private static void move(Integer[] bridges, Integer[] other_bridges,
            int direction, int position) {
        if (direction == 1) {// 往另一端走
            bridges[position] = 0;
            other_bridges[position] = 1;
        } else {// 回来接人走
            bridges[position] = 1;
            other_bridges[position] = 0;
        }
    }

    // 判断是否已经结束了
    // 当other_bridges {1,1,1,1}表示结束
    private static boolean isend(Integer[] other_bridges) {
        for (int i : other_bridges) {
            if (i == 0)
                return false;
        }
        return true;
    }

}

运行的结果:
这里写图片描述

2017年完美世界校招笔试题,从n层大楼往下扔m颗玻璃珠确定珠子破碎的临界楼层 这道题可以搜索google扔玻璃珠笔试题以及腾讯2017的校招笔试也有一道这样的题,不同的是,以上的题中只是用了两颗玻璃珠,而这里是m颗玻璃珠; 不过,同样是扔珠子,所以思路都是一样,只不过变得更有普适性; 阅读详情

相关推荐

2017滴滴前端笔试题总结

一、基础题 1.【单选】对于满足SQL92标准的SQL语句:SELECT foo,count(foo) FROM pokes WHERE foo>10 GROUP BY foo HAVINGORDER BY foo,其执行的顺序应为() A. From –>GroupBY->WHERE->HAVING->SELECT->ORDER BY B. From->WHERE –>GroupBY ->

sunday0904的博客 3508

2017完美世界研发部笔试题(取经)

师徒四人西天取经,途中必需跨过一座桥,四个人从桥的同一端出发,你得帮助他们到达另一端,天色很暗而他们只有一支手电筒,一次同时最多可以有两个人一起经过桥。而过桥的时候必须持有手电筒,所以就得有人把手电筒带来带去,来回桥两端。手电筒不能用丢的方式来传递,四个人的步行速度各不同,若两人同行则以较慢者的速度为准,大师兄需花1分钟过桥,二师兄需花2分钟过桥,三师兄需花5分钟过桥,师傅需花10分钟过桥。请问他

u013087645的专栏 1650

2015-2017互联网产品经理笔试题

(一)2015年百度产品经理笔试题 1、请分别给出世界杯开赛前、开赛期间、和开赛结束后,“世界杯”这个关键词下的用户主要需求,以及网页搜索结果展现页面。 (如果对世界杯不熟悉,可用一个热门电影代替,分析电影在上映前、上映中、上映后等各个时间区间的需求变化并设计展现页面) 2、如果不考虑数据的获取成本(假设任何数据都可以获得),请设计一款百度地图和大数据相结合的产品,产品形态不限。 (注:需...

JW_2018的博客 7374

四人过桥问题

1、问题背景 有4个人要过一座桥,都站在桥的某一边,要让他们在17分钟内全部通过这座桥。这时是晚上,他们只有一个手电筒,最多只能让两个人同时过桥。不管是谁过桥,不管是一个人还是两个人,必须要带>着手电筒。手电筒必须要传来传去,不能扔过去。每个人过桥的速度不同,两个人的速度必须以较慢的>那个人的速度过桥。  甲:过桥需要1分钟;   乙:过桥需要2分钟;   丙:过桥需要5分钟;   ...

gp1330782530的博客 3782

百度2017年计算机视觉笔试题

今年百度计算机视觉笔试题分布情况如下: 第一部分:30个选择题,每个2分 第二部分:2个简答题,一个20分,一个30分 第三部分:2个编程题,每个20分第一部分(有些题目不记得了)

yyywww666的专栏 6460

2017网易前端笔试题总结

整理了一下2017网易前端笔试题,附上了自己的答案,仅供参考,欢迎讨论和交流。如果有什么不对的地方,欢迎指正。 题目整理(不含答案) 网盘分享: 链接: https://pan.baidu.com/s/1dEYkyKp  密码: hxec 单选题: 1.下列哪些不是伪元素选择器: A. first-line B. before C. first-letter D.

sunday0904的博客 1万+

刷刷笔试题~(2)

1.四个平面最多把三维空间分成几个部分?(15) 知识点:n ^ 2-1 = 15 这个问题等价于:一个西瓜切4刀,假设在此过程中西瓜不散落,则最多可以切成几块? 前3刀沿横、纵、竖三个方向切成8块应该没有问题,第4刀怎么切呢? 要得到最多的块数,应该尽可能切到前8块,所以切法应该区别于前3刀的方向,即斜切,但总有1块切不到,所以答案为8×2-1=15 2.师徒四人西天取经,途中必需

nanaMasuda的博客 1358

基于java的 SMART系统-系统框架设计与开发(源代码+论文).rar

【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

C++ #笔试选择题 50道(1)

以下题目均为19,20校招中自己遇到不止一次的题目或知识点 加油! 程序输出结果为? Ans: 8 #include <stdio.h> main() { int a, b; //在第一次循环中,1%3==1,b=4 //在第二次循环中,4%3==1,b=7 //...22 共七次,a=8 for( a = 1,b = 1; a <= 100; a ++) { if( b &g...

TaoHan的博客 3693

SRE校招面试全攻略:从基础理论到实战场景解析

本文为SRE(站点可靠性工程)校招面试提供全面攻略,涵盖计算机基础、运维核心技能、场景设计与系统架构等关键模块。文章结合真实面试真题,解析了从Linux原理、网络协议到容器化、监控告警等实战考点,并分享了高可用设计、故障排查等工程思维,旨在帮助应届生夯实基础、理清思路,从容应对SRE校招挑战。

bush的博客 643

RDD2022 数据格式转换与清洗

Rdd2022数据集,是关于道路损伤的数据集,与rdd2020相比增加了两万多张图片但是由于格式不能被yolo直接使用且其中有大量的图片没有符合要求的标注,特写此文章记录数据清洗与格式化的过程。

蓝胖子的博客 9945

2017年java笔试题_2017年Java笔试题及答案

2017年Java笔试题及答案Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。下面是小编整理的关于Java笔试题及答案,欢迎参考!Java基础知识笔试题及答案1.Java中提供了名为()的包装类来包装原始字符串类型。A.IntegerB.CharC.DoubleD.String�0�2答案:D2.java.lang包的()方法比较两个对象是否相等,相等返回true。A.toStrin...

weixin_35812582的博客 634

SAP中寄售结算规则及要点分析

在做MRKO寄售结算时,系统会根据选定的期间和供应商等条件,将符合条件的寄售消耗或寄售上线的物料凭证找出。然后以供应商为单位。合并产生一张会计凭证。下图显示了通过MRKO结算后自动生成的会计凭证。 那么,在MRKO做寄售结算的规则是什么样的?做为寄售业务处理者的物流和财务需要掌握和了解哪些关于寄售结算的规则和控制逻辑。下面以笔者的经验分析一下: 1、寄售物料在系统中有两种处理方法,一种是通过MB1B 411 K ,通常该操作达到两个目的:将物料从仓库转移到线边库(表示即将要投入生产了)的同时将寄售库

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 8294

数字IC笔试题 ——复旦微2017

bleauchat的博客 6532

解密CANoe数据回放:从BLF到ASC的格式转换与优化策略

本文深入解析CANoe数据回放中BLF与ASC格式的转换与优化策略,帮助工程师高效处理汽车电子测试数据。详细介绍了两种格式的特性、转换方法及性能优化技巧,包括CANoe内置功能、命令行自动化和第三方工具应用,提升故障诊断和系统验证效率。

weixin_28331555的博客 535

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析

伶俐角少儿编程 727

百度2017春招笔试题二——回家

百度2017春招笔试题二——回家 题目来自牛客网,感谢! 从数轴上N个点中移除非首尾的一个,使从首到尾移动的总距离最短。 输入格式 第一行输入N,代表数轴上点的总个数 第二行输入N个数,代表各点的坐标 输入保证N≥3N\geq 3N≥3 输出格式 第一行输出一个数,代表最短的总距离 输入范例 4 1 4 -1 3 输出范例 4 考虑去掉一个点的过程造成的距离改变是对原距离的一个修正。注意到点aia_iai​的原距离为∣ai−ai−1∣+∣ai−ai+1∣|a_i-a_{i-1}|+|a_

Uranum的博客 303

MATLAB - 激光雷达 - 相机联合标定(Lidar-Camera Calibration)

激光雷达传感器和相机通常在自动驾驶应用中结合使用,因为激光雷达传感器收集三维空间信息,而相机则以二维图像捕捉空间的外观和纹理。您可以融合来自这些传感器的数据来改进物体检测和分类。激光雷达-相机标定可以估算出一个变换矩阵,给出两个传感器之间的相对旋转和平移。在进行激光雷达-相机数据融合时,您可以使用该矩阵。本图说明了激光雷达和相机标定 (LCC) 过程的工作流程,我们使用棋盘格作为标定对象。我们从激光雷达和相机数据中提取棋盘角和平面,然后在它们的坐标系之间建立几何关系,进行标定。

机器人控制与仿真应用 7370

滴滴出行2017秋招算法笔试题(作弊概率)

一、前言最近博客的更新频率也挺快的,希望自己能坚持下去。每周一篇面试题,这周的面试题是算法笔试题,面试题不知不觉也写了几个月了,不难发现,那些大企业都喜欢考算法题。二、题目一位滴滴实习生开发出了一套简易作弊检测系统,此系统存在一定误差。如果一个用户确实存在作弊行为,但是此系统没有检测出的概率为 5 %,但是误检为作弊的概率为 1 %;我们已经知道,一个用户作弊的概率为 0.1 % 。目前一个人被此方

GitHubClub 5957

详细指南:如何在TI C2000基于C28x的微控制器上部署FreeRTOS_C语言实现

FreeRTOS是一个小型、开源、实时的嵌入式操作系统内核。它为多种微控制器和处理器提供了支持,包括ARM、AVR、MSP430和PIC等。小型和轻量级:适合资源受限的嵌入式系统。实时性:可以满足严格的实时要求。多任务支持:支持多任务并发执行。内存管理:提供了多种内存管理策略。模块化设计:用户可以根据需要选择所需的功能模块。TI C2000系列微控制器是专为实时控制应用设计的。高性能C28x核:提供了高速的浮点运算能力。丰富的外设:包括PWM、ADC、DAC、通信接口等。低功耗。

qq_38334677的博客 1606

基于电能质量治理的场景实例:统一电能质量调节器(UPQC)与并网逆变器集成

本文通过Simulink平台,详细演示了统一电能质量调节器(UPQC)与并网逆变器的集成系统建模与仿真过程。主要内容包括:1)系统架构设计,包含光伏并网系统、非线性负载和电压扰动源;2)UPQC主电路设计,包括串联/并联单元拓扑和控制策略实现;3)与并网逆变器的能量交互与协同控制逻辑;4)典型电能质量问题的仿真测试场景。结果表明,该集成系统能有效治理电压暂降(维持负载电压380V±2%)和电流谐波(电网THD<3%),直流母线电压稳定在800V±5V。该系统为应对复杂电能质量问题提供了"电压

xiaoheshang_123的博客 309

完美世界2017校招技术综合A卷:考点与答题策略全解析

技术笔试是衡量开发者基础素养的重要方式,尤其是游戏行业校招,常通过综合卷考察候选人的C++基础、数据结构与算法以及网络编程能力。完美世界2017技术综合A卷正是这一模式的典型代表,其出题逻辑强调从原理出发,将指针、虚函数、栈队列等知识还原到游戏开发场景中。理解这些技术概念的性能特征与适用边界,能有效提升笔试答题的准确率。从通用技术原理切入,结合游戏行业常见应用,最终聚焦于该卷的考点拆解与备考方法,帮助求职者构建系统化复习路径。

weixin_29015483的博客 317

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: Wiki_Android_网络工具类NetworkUtils
下一篇: GitHub_删除一个repository(仓库)
Two_Water
博客等级 码龄12年 573粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值