1 双核CPU

题目:一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。
链接:https://www.nowcoder.com/questionTerminal/9ba85699e2824bc29166c92561da77fa
来源:牛客网
输入描述:

输入包括两行:第一行为整数n(1 ≤ n ≤ 50)第二行为n个整数length[i](1024 ≤ length[i] ≤ 4194304),表示每个任务的长度为length[i]kb,每个数均为1024的倍数。

输出描述:

输出一个整数,表示最少需要处理的时间

示例:

输入
5输出
9216

思路:这道题可以理解为一个01背包问题,双核CPU并行处理任务就是把所有任务分成两组,使时间最少就是让两组任务中花费时间较少的那组任务花费时间尽可能的接近串行总时间的一半,即求一个小于总时间一半的最大时间。使用动态规划求最优解,dp[i][j]表示前i个任务中总时间为j时可以进行任务的最大时间,dp[i][j] = max{dp[i-1][j],dp[i-1][j-nums[i]]+nums[i]}。其中nums[i]表示第i个任务的时间;dp[i-1][j]表示前i-1个任务中总时间为j时进行任务的最大时间,即第i个任务不加入这一组;dp[i-1][j-nums[i]]表示前i-1个任务中总时间为j-nums[i]时进行任务的最大时间,避免加入nums[i]后超过总时间j。
代码:

public class Main {public static void main(String args[]) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int n = sc.nextInt();int[] nums = new int[n];int sum = 0;for(int i=0;i<n;i++){nums[i] = sc.nextInt()/1024;sum += nums[i];}int[] dp = new int[sum/2+1];for(int i=0;i<n;i++){for(int j=sum/2;j>=nums[i];j--){dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i]);}}System.out.println((sum-dp[sum/2]) * 1024);}}
}

2 魔力手环

题目:小易拥有一个拥有魔力的手环上面有n个数字(构成一个环),当这个魔力手环每次使用魔力的时候就会发生一种奇特的变化:每个数字会变成自己跟后面一个数字的和(最后一个数字的后面一个数字是第一个),一旦某个位置的数字大于等于100就马上对100取模(比如某个位置变为103,就会自动变为3).现在给出这个魔力手环的构成,请你计算出使用k次魔力之后魔力手环的状态。
链接:https://www.nowcoder.com/questionTerminal/79c639e02bc94e6b919e3372c8e1dc5e
来源:牛客网
输入描述:

输入数据包括两行:第一行为两个整数n(2 ≤ n ≤ 50)和k(1 ≤ k ≤ 2000000000),以空格分隔第二行为魔力手环初始的n个数,以空格分隔。范围都在0至99.

输出描述:

输出魔力手环使用k次之后的状态,以空格分隔,行末无空格。

示例:

输入
3 2
1 2 3输出
8 9 7

思路:一开始暴力求解,结果就超时了,查了查发现可以用快速幂矩阵。快速幂的时间可以达到O(logn),比如A156=A128∗A16∗A8∗A4A^{156}=A^{128} * A^{16} * A^8 * A^4,156用二进制表示是10011100,和组成A156A^{156}的乘数是对应的。回到这个题目本身,魔力手环每使用一次魔法每个数字会变成自己跟后面一个数字的和。
可以构造一个类似下面的矩阵A,每使用一次魔法就是用乘一次A,使用k次就是Ak∗NTA^k*N^T(假设N为初始数组),再使用快速幂的方法求解AkA^k就好,大大减少了时间复杂度。

⎡⎣⎢101110011⎤⎦⎥(A)

\left[\begin{matrix}1 & 1 & 0 \\0 & 1 & 1 \\1 & 0 & 1\end{matrix}\right] \tag{A}

代码:

public class Main {public static void main(String args[]) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int n = sc.nextInt();int k = sc.nextInt();int nums[] = new int[n];for(int i=0;i<n;i++){nums[i] = sc.nextInt();}//            while(k > 0){//                int f = nums[0];
//                for(int i=0;i<n-1;i++){//                    nums[i] = (nums[i] + nums[i+1])%100;
//                }
//                nums[n-1] = (nums[n-1] + f)%100;
//                k--;
//            }//构造快速幂矩阵int[][] r = new int[n][n];for(int i=0;i<n;i++){for(int j=0;j<n;j++){if((i==j) || (j==i+1)){r[i][j] = 1;}else{r[i][j] = 0;}}}r[n-1][0] = 1;int[][] resMatrix = new int[n][n];for(int i=0;i<n;i++){resMatrix[i][i] = 1;}//快速幂while(k != 0){if((k & 1) == 1){resMatrix = mulMatrix(resMatrix, r, n);}r = mulMatrix(r, r, n);k = k >> 1;}//求结果int[] res = new int[n];for(int i=0;i<n;i++){res[i] = 0;for(int j=0;j<n;j++){res[i] += resMatrix[i][j] * nums[j];}res[i] %= 100;}StringBuilder sb = new StringBuilder();for(int i:res){sb.append(i + " ");}System.out.println(sb.toString().trim());}}private static int[][] mulMatrix(int[][] resMatrix, int[][] r, int n) {int[][] res = new int[n][n];for(int i=0;i<n;i++){for(int j=0;j<n;j++){res[i][j] = 0;for(int k=0;k<n;k++){res[i][j] += resMatrix[i][k] * r[k][j];}res[i][j] %= 100;}}return res;}
}

3 堆砖块

题目:小易有n块砖块,每一块砖块有一个高度。小易希望利用这些砖块堆砌两座相同高度的塔。为了让问题简单,砖块堆砌就是简单的高度相加,某一块砖只能使用在一座塔中一次。小易现在让能够堆砌出来的两座塔的高度尽量高,小易能否完成呢。
链接:https://www.nowcoder.com/questionTerminal/040924ba0e64423b8a3fe2f75a56934a
来源:牛客网
输入描述:

输入包括两行:第一行为整数n(1 ≤ n ≤ 50),即一共有n块砖块第二行为n个整数,表示每一块砖块的高度height[i] (1 ≤ height[i] ≤ 500000)

输出描述:

如果小易能堆砌出两座高度相同的塔,输出最高能拼凑的高度,如果不能则输出-1.
保证答案不大于500000。

示例:

输入
3
2 3 5输出
5

思路:本题同样使用动态规划。同样是将所有的砖块分为A、B两组,是两组的砖块数量相同且最高。构造dp[i][j]表示放入前i个砖块后,A和B的高度差为j时B的高度,j=B-A。那么dp[i][j] = max{dp[i-1][j], dp[i-1][j+h[i]], dp[i-1][j-h[i]]+h[i]},其中dp[i-1][j]表示第i个砖块既不放入A也不放入B;dp[i-1][j+h[i]]表示第i个砖块放入了A,这里需要解释一下,第i个砖块放入了A,B的高度是没变的,高度差减小了h[i],但是为了让他们的高度差仍然是j,此时B的高度是和放入第i-1块时高度差为j+h[j]时同高的;dp[i-1][j-h[i]]+h[i]表示第i个砖块放入了B,B的高度增加了h[i],高度差也增加了h[i],为了让他们的高度差仍然是j,所以用放入第i-1块时高度差为j-h[j]时B的高度加上h[i].
代码:

public class Main {public static void main(String args[]) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int n = sc.nextInt();int[] h = new int[n+1];int sum = 0;for(int i=1;i<=n;i++){int num = sc.nextInt();h[i] = num;sum += num;}int[][] dp = new int[2][sum*2+1];Arrays.fill(dp[0], -1);dp[0][sum] = 0;int f = 1;for(int i=1;i<=n;i++){for(int j=0;j<=sum*2;j++){dp[f][j] = dp[1-f][j];if(j+h[i] <= sum*2 && dp[1-f][j+h[i]] != -1){dp[f][j] = Math.max(dp[f][j], dp[1-f][j+h[i]]);}if(j-h[i] >= 0 && dp[1-f][j-h[i]] != -1){dp[f][j] = Math.max(dp[f][j], dp[1-f][j-h[i]] + h[i]);}}f = 1-f;}if(dp[1-f][sum] == 0){System.out.println("-1");}else{System.out.println(dp[1-f][sum]);}}}
}

4 分饼干

题目:易老师购买了一盒饼干,盒子中一共有k块饼干,但是数字k有些数位变得模糊了,看不清楚数字具体是多少了。易老师需要你帮忙把这k块饼干平分给n个小朋友,易老师保证这盒饼干能平分给n个小朋友。现在你需要计算出k有多少种可能的数值。
链接:https://www.nowcoder.com/questionTerminal/44d0ee89b51b4725b403d1df2381d2b2
来源:牛客网
输入描述:

输入包括两行:
第一行为盒子上的数值k,模糊的数位用X表示,长度小于18(可能有多个模糊的数位)
第二行为小朋友的人数n

输出描述:

输出k可能的数值种数,保证至少为1

示例:

输入
9999999999999X
3输出
4

思路:这道题的目标是求k有多种可能的数值,可以使k除以n的余数为0。在除法的过程中,是从最高位开始除的,有余数的话会累加到下一位,那么我们可以将所有可能出现的余数存起来。构造一个二维数组dp[i][j]表示第i位(高位开始,从1记)余数为j的情况的数量,那么最后一位且除尽的可能数量就为dp[k.length][0]。
代码:

public class Main {public static void main(String args[]) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String str = sc.next();char[] k = str.toCharArray();int n = sc.nextInt();long[][] dp = new long[k.length+1][n];dp[0][0] = 1;for(int i=1;i<=k.length;i++){for(int j=0;j<n;j++){for(int t=0;t<10;t++){if(k[i-1] == 'X' || k[i-1] - '0' == t){int m = (j * 10 + t) % n;dp[i][m] += dp[i-1][j];}}}}System.out.println(dp[k.length][0]);}}
}

网易2017年春招笔试题记录相关推荐

  1. 2018年网易游戏春招笔试题

    2018年网易游戏春招笔试题(2018.04.16) 题目一 生产线问题 题目描述 作为一条生产线的负责人,你手头上有N个订单,你需要通过这条生产线去处理这些订单.每个订单可以用两个属性去描述:耗时p ...

  2. 意淫系列-2018美图春招笔试题

    2018美图春招笔试题 只是试水,没有A类会议拒绝实习. 题不难,陪女朋友吃饭去了,然后就没怎么时间,只是看了下题. 题型:选择题和编程题,选择题25道,涉及数据结构,C,Python,C++,图像, ...

  3. 2018年京东春招笔试题

    2018年京东春招笔试题(2018.04.09) 题目一 整数分解 题目描述 小Q的数学老师给小Q一个整数N,问小Q能否将W分解为两个整数X和Y相乘,并且满足X为奇数,Y为偶数.即能否找到奇数X和偶数 ...

  4. 中国联通智网创新中心2021春招笔试题

    中国联通智网创新中心2021春招笔试题 这个智网中心是2020年5月新建立的,之前没听过.然后这次报名参加了笔试,实际上这是第二次笔试,第一次题很难(对我来说)然后非常惨,考完之后人家将近两个礼拜没通 ...

  5. 30K 月薪运维工程师面试考什么?滴滴17年春招笔试题

    转眼之间已经进入了18年2月份.每年的2.3月份,工程师们就会迎来新一波的跳槽高峰.为了拿到更高的薪资,好好准备笔试.面试当然是重中之重. 今天小编为大家整理了去年滴滴春招的笔试题,快来试试自己能不能 ...

  6. python招聘笔试题_滴滴2020年春招笔试题分析(Python)

    数据背景来自:优梨:滴滴2020年春招Sql笔试题分析​zhuanlan.zhihu.com 这里就不再重复了,主要描述如何使用python数据清洗 问题: 1.订单的平均应答率是多少?完单率是多少? ...

  7. 乐飞天下python笔试题_滴滴2020年春招笔试题分析(Python)

    数据背景来自:优梨:滴滴2020年春招Sql笔试题分析​zhuanlan.zhihu.com 这里就不再重复了,主要描述如何使用python数据清洗 问题: 1.订单的平均应答率是多少?完单率是多少? ...

  8. 招银网络科技java春招二面_招银网络科技 2019春招笔试题复盘

    因本人刚开始写博客,学识经验有限,如有不正之处望读者指正,不胜感激:也望借此平台留下学习笔记以温故而知新.这篇博客是复盘回忆招银网络科技2019春招的笔试试题类型,相关岗位:算法工程师. 简要介绍:时 ...

  9. 米哈游2020春招笔试题总结

    1.笔试题 - 网络I/0多路复用中的epoll和select机制 参考:https://www.cnblogs.com/jeakeven/p/5435916.html - linux中fork和ex ...

最新文章

  1. 类与类之间 相同属性及字段拷贝
  2. python培训学校-如何找到靠谱的Python培训学校?
  3. [ZZ] 使用rsync来实现快速删除大量文件
  4. win启动linux iso文件位置,安装Linux之后如何进入win系统?
  5. 破境Angular(三)Angular构件之模块
  6. c语言运行k值不变,C语言期末复习(改完).doc
  7. 【luogu1816】忠(RMQ问题、线段树)
  8. OCM_第十一天课程:Section5 —》数据仓库
  9. python爬虫正则表达式爬取网页标签_Python爬虫实例(4)-用urllib、re和正则表达式爬取网页图片...
  10. 非科班普通本科就注定进不了大厂?我不服
  11. 固高板卡mct2008调试轴回零_MCT2008-for-ges 固高所有GE运动控制卡的DEMO软件,用来测试板卡是否正常工作 matlab 238万源代码下载- www.pudn.com...
  12. 魔兽代理又起风云:网易暴雪腾讯的利益博弈
  13. vue项目实战(pc端)
  14. 用html写游戏,Html5写一个简单的俄罗斯方块小游戏
  15. 一个440MHz的微带线耦合电路
  16. 微信扫码关注公共号生成上下级关系,扫码之后的流程
  17. 教会你ECshop安装百度分享按钮教程
  18. ParaView-2
  19. 如何使用 Docker 部署 Ghost 博客
  20. 真正的爷们该做的事!

热门文章

  1. redis 数据删除策略和逐出算法
  2. 哈里森,史上最具空间价值的钟表匠
  3. 一个年轻化品牌的自我修养:打造人格化流量
  4. kettle配置资源库
  5. 沉没成本:为什么该放手时我们总是无法放手
  6. Jvm元空间存哪些数据
  7. 天津大学仁爱学院ACM队简介
  8. 北京新世纪计算机学校地,石家庄新世纪电脑学校
  9. 在eclipes 中配置python
  10. 在Linux(fedora 20)上解压缩rar文件