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开始