说下我对第三题的看法,主要是牛棚和奶牛需要匹配。如果奶牛的高度超过牛棚,那么自然牛就会跑走。那么问题的关键就是奶牛该怎么排队,就是一个全排列问题。

image

http://usaco.org/index.php?page=viewproblem2&cpid=1085

这里给的样例输入是 4 1 2 3 4 2 4 3 4

其中,牛的高度1 2 3 4,如果按照不同的顺序进行排列,可以有

A(4)(4)=4*3*2*1=24

种方案。这个全排列在Python当中,有一个库叫itertool,直接调用即可。但是要注意,它的返回值是一个特殊的itertool对象,要把它转换成元组才可以调用。类似

import itertools
a = [1,2,3,4]
b = itertools.permutations(a,4)
c = tuple(b)
for i in c:
    print(i)

类似这样使用,才会输出所有答案。 结合题意把代码优化一下,可得

import itertools

n = int(input())
a = [int(i) for i in input().split(" ")]
b = [int(i) for i in input().split(" ")]

c = tuple(itertools.permutations(a,n))

count = 0

for cn in c:
    flag = True
    for i in range(n):
        if cn[i]>b[i]:
            flag = False
    if flag:
        count += 1

print(count)

但是代码虽然运行结果会对。但是面对数据量很大的时候,会超时(Time Out)。所以,有些重复的步骤,不需要过多的去计算,因此,还需要引入一些”剪枝“的思想去优化算法。因为竞赛时间有限,并没有把后面优化的代码加上去。目前5个通过(Accept)基本也能顺利晋级,后续会继续补充上优化版的代码的。