网易2019秋季校园招聘编程题真题部分

1。俄罗斯方块

小易有一个古老的游戏机,上面有着经典的游戏俄罗斯方块。因为它比较古老,所以规则和一般的俄罗斯方块不同。 荧幕上一共有 n 列,每次都会有一个
1 x 1 的方块随机落下,在同一列中,后落下的方块会叠在先前的方块之上,当一整行方块都被占满时,这一行会被消去,并得到1分。
有一天,小易又开了一局游戏,当玩到第 m 个方块落下时他觉得太无聊就关掉了,小易希望你告诉他这局游戏他获得的分数。

输入描述:
 第一行两个数 n, m 第二行 m 个数,c1, c2, ... , cm , ci 表示第 i 个方块落在第几列 其中 1 <= n, m <= 1000, 1 <= ci <= n  
示例: 
输入: 3 9 1 1 2 2 2 3 1 2 3 
输出: 2

分析:
要求获得的分数,实际上是求各列中元素的最少个数(类似于短板效应)。可以用一个字典去统计各列中的元素个数,然后求最小,但是注意边界条件,即必须保证各列元素都有元素出现。

n, m = map(int, raw_input().split())
c = map(int, raw_input().split())
# 统计每列的方块个数
d = {}
for i in c:
    if i in d:
        d[i] += 1
    else:
        d[i] = 1
if len(d)<n:
    print 0
else:
    ans = float("Inf")
    for i in d.values():
        ans = min(i, ans)
    print ans

2。瞌睡

小易觉得高数课太无聊了,决定睡觉。不过他对课上的一些内容挺感兴趣,所以希望你在老师讲到有趣的部分的时候叫醒他一下。你知道了小易对一堂课每分钟知识点的感兴趣程度,并以分数量化,以及他在这堂课上每分钟是否会睡着,你可以叫醒他一次,这会使得他在接下来的k分钟内保持清醒。你需要选择一种方案最大化小易这堂课听到的知识点分值。

输入描述:
第一行 n, k (1 <= n, k <= 105) ,表示这堂课持续多少分钟,以及叫醒小易一次使他能够保持清醒的时间。
第二行 n 个数,a1, a2, ... , an(1 <= ai <= 104) 表示小易对每分钟知识点的感兴趣评分。
第三行 n 个数,t1, t2, ... , tn 表示每分钟小易是否清醒, 1表示清醒。


输出描述:
小易这堂课听到的知识点的最大兴趣值。

输入例子1:
6 3
1 3 5 2 5 4
1 1 0 1 0 0

输出例子1:
16

分析:
本题要求在给定时间内得到最大的兴趣点。借鉴了别人的方法,可是accept 率为80%。。。然后又借鉴了一个人,通过了。。。。

# 通过代码
n, k = map(int, raw_input().strip().split())
a = map(int, raw_input().strip().split())
b = map(int, raw_input().strip().split())
ans1 = 0
#  累加清醒状态的得分,并把其归0
for i in range(n):
    if b[i] == 1:
        ans1 += a[i]
        a[i] = 0
ans2 = 0
# a[i]是对前i个节点的累加和,准确说是瞌睡状态的累加,因为上步循环将清醒状态归为0
for i in range(1, n):
    a[i] += a[i-1]
# 找到前k个节点中的瞌睡状态的最大值并储存在ans2中
for i in range(k):
    ans2 = max(ans2, a[i])
# 找到k个节点后的任意k个节点的瞌睡状态的最大值
for i in range(k, n):
    ans2 = max(ans2, a[i]-a[i-k])
print ans1+ans2

3。丰收

又到了丰收的季节,恰逢小易去牛牛的果园里游玩。
牛牛常说他对整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。
在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。
牛牛觉得这个问题太简单,所以希望你来替他回答。

输入描述:
第一行一个数n(1 <= n <= 105)。
第二行n个数ai(1 <= ai <= 1000),表示从左往右数第i堆有多少苹果
第三行一个数m(1 <= m <= 105),表示有m次询问。
第四行m个数qi,表示小易希望知道第qi个苹果属于哪一堆。

输出描述:
m行,第i行输出第qi个苹果属于哪一堆。

输入例子1:
5
2 7 3 4 9
3
1 25 11

输出例子1:
1
5
3

分析:
这题比较简单。首先存储每个堆及之前堆的总数,然后进行查找(因为是总数列表是递增的,所以可以使用二分法,btw,用普通查找爆出时间复杂度超时)

n = int(raw_input())
a = map(int, raw_input().split())
m = int(raw_input())
q = map(int, raw_input().split())
total = [0]*n
tsum = 0
for i in range(n):
    tsum += a[i]
    total[i] = tsum
def bisearch(seq, k):
    mid = len(seq)//2
    if seq[mid] == k:
        return mid
    left, right = 0, len(seq)-1
    while left <= right:
        mid = (right-left)//2 + left
        if seq[mid]<k:
            left = mid+1
        elif seq[mid]>=k:
            right = mid-1
        else:
            return mid
    return left

for i in range(m):
    print bisearch(total, q[i])+1 # 因为堆从1开始

猜你喜欢

转载自blog.csdn.net/agaoq/article/details/81676960