【面试题】网易互娱(游戏)2020校招在线笔试-游戏研发第一批[水平线]
伞屉国是一个以太阳能为主要发电手段的国家,因此他们国家中有着非常多的太阳能基站,链接着的基站会组合成一个发电集群。但是不幸的是伞屉国不时会遭遇滔天的洪水,当洪水淹没基站时,基站只能停止发电,同时被迫断开与相邻基站的链接。你作为伞屉国的洪水观察员,有着这样的任务:在洪水到来时,计算出发电集群被洪水淹没后被拆分成了多少个集群。
由于远古的宇宙战争的原因,伞屉文明是一个二维世界里的文明,所以你可以这样理解发电基站的位置与他们的链接关系:给你一个一维数组a,长度为n,表示了n个基站的位置高度信息。数组的第i个元素a[i]表示第i个基站的海拔高度是a[i],而下标相邻的基站才相邻并且建立链接,即x号基站与x-1号基站、x+1号基站相邻。特别的,1号基站仅与2号相邻,而n号基站仅与n-1号基站相邻。当一场海拔高度为y的洪水到来时,海拔高度小于等于y的基站都会被认为需要停止发电,同时断开与相邻基站的链接。
输入描述:
每个输入数据包含一个测试点。第一行为一个正整数n,表示发电基站的个数 (0 < n <= 200000)接下来一行有n个空格隔开的数字,表示n个基站的海拔高度,第i个数字a[i]即为第i个基站的海拔高度,对于任意的i(1<=i<=n),有(0 <= a[i] < 2^31-1)接下来一行有一个正整数q(0 < q <= 200000),表示接下来有q场洪水接下来一行有q个整数,第j个整数y[j]表示第j场洪水的海拔为y[j],对于任意的j(1<=j<=n),有(-2^31 < y[j] < 2^31-1)
输出描述:
输出q行,每行一个整数,第j行的整数ans表示在第j场洪水中,发电基站会被分割成ans个集群。标准答案保证最后一个整数后也有换行。
输入例子1:
10
6 12 20 14 15 15 7 19 18 13
6
15 23 19 1 17 24
输出例子1:
2
0
1
1
2
0
题意不复杂,稍微记以下就能理解,根据题意:
当洪水高度为15时,发电站【6 12 20 14 15 15 7 19 18 13 】将会变成【0 0 5 0 0 0 0 4 3 0 】 此时只剩下2个集群
当洪水高度为23时,发电站【6 12 20 14 15 15 7 19 18 13 】将会变成【0 0 0 0 0 0 0 0 0 0 】 此时只剩下0个集群
就此来看题目还是比较简单的,先贴上博主思路:
m = int(input())
ji_zhan = list(map(int, input().split()))
n = int(input())
hong_shui = list(map(int, input().split()))
for i in hong_shui: s = 0 #s用于记录基站是否相连res = 0 #res用于记录集群数量for j in ji_zhan:if j > i and s == 0: #当洪水低于基站时,且前一个基站已淹没s += 1 #当前基站成为一个集群elif s != 0 and j<= i: #当洪水高于基站时,且前一个基站没有被淹没s = 0 #淹没当前基站,将集群保存至res中res += 1if s >0: #若遍历完成,仍然存在一个集群(即最后一个基站没被淹没)res += 1 #集群 + 1print(res)
看上去逻辑上没什么问题,但是跑了一下,发现只跑过了20%的样例就超时了
按我的思路来,时间复杂度为O(n**2),想了很久没想出优化方法,交卷以后看了官方解QAQ
官方解:
enb = int(input())
a_alti = list(map(int, input().split()))
hx_t = int(input())
hx_h = list(map(int, input().split()))rsp_a = list(range(0, enb + 2))
rsp_a[0] = -1
rsp_a[enb + 1] = -1 # 有效数据在[1:发电站个数]#(此表为已被淹没的基站表,定义两个-1是为了方便后续对是否产生新集群做判断)hx_new_index = [index for index, value in sorted(enumerate(hx_h), key=lambda h: h[1])]#首先用enumerate函数把记录洪水的列表变成一个索引序列,序列中的每个元素是一个包含两个数据的元组,数据一为列表中元素的下标,数据二为列表中元素的值#再对该列表进行排序,排序规则为列表中元组的第二个数据#此时列表为如果洪水为[1,3,5,2,4],则此时列表为[0,3,1,4,2]a_new_index = [index for index, value in sorted(enumerate(a_alti), key=lambda h:h[1])]cluster_num = [0] * hx_t #创建一个长度为hx_t的列表,列表中每个值都是0,用来保存输出数据k = 0 #k用来遍历基站for i in range(hx_t): #i 用来遍历洪水new_cluster = 0 #集群变化量while k+1 <= enb and a_alti[a_new_index[k]] <= hx_h[hx_new_index[i]]:#如果基站尚未遍历完成,且基站的第k小个元素<=洪水中第i+1个元素,则循环继续#如果洪水小于基站,则该洪水可直接跳过循环if rsp_a[(a_new_index[k]+1)-1] == -1 and rsp_a[(a_new_index[k]+1)+1] == -1: #如果左边被淹了而且右边也被淹了new_cluster -=1 #集群-1elif rsp_a[(a_new_index[k]+1) -1] != -1 and rsp_a[(a_new_index[k]+1)+1] != -1: #如果左右都没被淹new_cluster +=1 #集群+1rsp_a[a_new_index[k]+1] = -1 #基站淹没,变为-1k += 1if i == 0:cluster_num[hx_new_index[i]] = 1 + new_cluster #初始状态所有基站共同为一个集群,故为1else:cluster_num[hx_new_index[i]] = cluster_num[hx_new_index[i - 1]] + new_cluster #上一个洪水中剩余的集群 + 这次洪水的变化for cn in cluster_num:print(cn)
此代码参考自 牛客网 用户“牛客680312541号”
(源码写得比较复杂,而且没有注释,所以改进了一下并加了一些注释方便阅读,总体思路还是很好懂的,不过还是代码还是显得很臃肿,希望大家能提出更好更python的解法)
难度:中等
【面试题】网易互娱(游戏)2020校招在线笔试-游戏研发第一批[水平线]相关推荐
- 网易游戏(互娱)2020校招在线笔试-游戏研发
第一题 小A刚学了二进制,他十分激动.为了确定他的确掌握了二进制,你给他出了这样一道题目:给定N个非负整数,将这N个数字按照二进制下1的个数分类,二进制下1的个数相同的数字属于同一类.求最后一共有几类 ...
- 网易游戏(互娱)2020校招在线笔试-游戏研发第一批-笔试编程题
[编程题]二进制计数-研发 小A刚学了二进制,他十分激动.为了确定他的确掌握了二进制,你给他出了这样一道题目:给定N个非负整数,将这N个数字按照二进制下1的个数分类,二进制下1的个数相同的数字属于同一 ...
- 【面试题】网易互娱(游戏)2020校招在线笔试-游戏研发第一批[游泳池]
小明作为一个游泳池管理员,以玩弄给水管和排水管为乐,也因此产生了很多数学题考验小朋友. 现在小明想把这个行动升级,考验一下程序员,做了一个自动装置来控制给水管和排水管.在开始时,给水管和排水管都是打开 ...
- 网易互娱2022校园招聘在线笔试-游戏研发工程师(第一批)
文章目录 A 身份证合法性检查 B 田径排名 C 永远的七日之都 题目来源:牛客网 考试题型:3道程序题 考试时间:(北京时间,UTC+08:00)2021年08月07日 19:30:00 -- 22 ...
- 网易互娱2017实习生招聘在线笔试(二)
题目2 : 源代码编译 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在网易游戏的日常工作中,C++ 是一门常用的语言.面对众多的 C++ 代码,等待源文件编译的漫长时 ...
- 网易互娱2017实习生招聘在线笔试第一场-2源代码编译
http://hihocoder.com/contest/ntest2016spring1/problem/2 拓扑排序 处理一下字符串 没什么好说的.. 时间限制:10000ms 单点时限:1000 ...
- 网易互娱2017实习生招聘在线笔试--源代码编译
描述 在网易游戏的日常工作中,C++ 是一门常用的语言.面对众多的 C++ 代码,等待源文件编译的漫长时间是个令人糟心的时刻,一直以来大家对此怨声载道.终于有一天,大家找到了你,一位优秀的程序员,请你 ...
- 网易互娱2017实习生招聘在线笔试(三)
题目3 : 画线 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小王最近在开发一种新的游戏引擎,但是最近遇到了性能瓶颈.于是他打算从最基本的画线功能开始分析优化.画线其 ...
- 网易互娱2017实习生招聘在线笔试第一场-3划线
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小王近期在开发一种新的游戏引擎,可是近期遇到了性能瓶颈.于是他打算从最主要的画线功能開始分析优化. 画线事实上就是调用 ...
最新文章
- 用命令行非交互改密码
- Linux查看用户所属用户组
- 《CUDA高性能并行计算》----2.2 需要知道的CUDA API和C语言拓展
- 计算数字的位数并逆序输出
- matlab矩阵0-1归化,数据标准化归化处理.doc
- php回调后门,PHP 回调后门笔记
- 【微信小程序】——wxss引用外部CSS文件及iconfont
- 【HDL系列】半减器、全减器和减法器原理和设计
- 横向合计代码 锐浪报表_巧用锐浪报表:用报表脚本实现动态显示小数位数
- Markdown工具之Typora--画思维导图
- 高等数学张宇18讲 第四讲 一元函数微分学的几何应用
- 安徽大学本科毕业论文中英文题目修改指南
- 用户故事 | 李兆龙:博观而约取,厚积而薄发
- 关于蓝牙无线通信与AOA定位技术
- C语言课程设计 雷克子波反射系数 相位移动等
- 情人节,你约,还是不约?
- Log4cplus编译
- Qt图形视图QGraphicsItem类
- 遮天 | 实战绕过卡巴斯基、Defender上线CS和MSF及动态命令执行...
- 2021四川省高考单科成绩查询,2021四川高考总分及各科分数