爱奇艺19秋招编程题

最少的盒子
时间限制: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)

遗憾的是这段代码超时了,只能不情愿的写斐波那契方法

猜你喜欢

转载自blog.csdn.net/qq_17641711/article/details/82889566