最少的盒子
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 131072KB;其他语言 655360KB
题目描述:
Bob有N个空盒子,第i个盒子是边长为a[i]的立方体,如果一个盒子的边长严格小于另一个盒子,并且大盒子里面没有其他小盒子,小盒子也没有放入其他大盒子中,那么这个小盒子可以放入大盒子。Bob可以根据条件任意的放盒子,因为他想看见最少数量的盒子。没有放入其他盒子的盒子是可以被看到的,请你帮Bob确定能看见盒子的最少数量。
测试用例
3
1 2 3
1
这题思路很简单,能叠加放的无非是递增序列,首先我们找出最长的递增序列,然后递归就好,注意递归出口
AC代码
def f(target):
if(len(target)) == 0:
return []
if(len(target) == 1):
return [target]
for i in target:
if i <= 0:
return []
tmp = sorted(list(set(target)))
res = []
dic_target = {}
for i in target:
if i not in dic_target:
dic_target[i] = 1
else:
dic_target[i] += 1
for i in dic_target:
res += (dic_target[i] -1) * [i]
return f(res)+[tmp]
while True:
x = raw_input()
y = map(lambda x:int(x),raw_input().split())
print len(f(y))
第二题,
清雨的自助餐
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 131072KB;其他语言 655360KB
题目描述:
清雨又在吃自助餐了。
排在清雨面前的有N种食物,排成一排,清雨可以选择其中的若干种食物,但是不能连续选择相邻的食物。因为清雨很挑食,当所有食物都不合口味时,他可以一种都不选,即一个都不选也算为一种方法。
请问他有多少种选择食物的方法呢?
3
样例输出
5
简单的思路是斐波那契数列,AC代码如下:
def f(n):
if(n == 0):
return 1
if(n == 1):
return 2
count = 0
a = 1
b = 2
while(count < n):
a,b = b,a+b
count += 1
return a
while True:
x = int(raw_input())
print f(x)
但是,这题其实很好玩,我们完全可以采用递归的思想,N个点所有方案,可以看成第n个点的方案和前面n-1个方案的和,我们可以从第N个点来看,如果第N个与前面N-1种选择方案中相邻,那么就跳过,不然就合并成一种新的方案,加入到总体方案中去,基于这个思路可以用下列代码输出所有的结果:
def f(n):
if(n == 0):
return []
if(n == 1):
return [[1],[]]
tmp = []
x = n - 1
for i in f(n-1):
if x not in i:
i.append(n)
tmp.append(i)
return tmp + f(n - 1)
while True:
x = int(raw_input())
print f(x)
遗憾的是这段代码超时了,只能不情愿的写斐波那契方法