codeforces 510D Fox and Jumping

题目大意:

给定n个数,其中每次个数有一个权值,从中选中k个数,使得能利用加减法,得到数轴上所有的整数并且权值和最小,其实也就是能得到1。

可想到求最大公约数里有个辗转相减法,当这K个数的最大公约数为1时,则满足第一个条件。

代码:

In = lambda:map(int, raw_input().split())
input()
ads = {0:0}
def gcd(a, b):
    while b:
        b, a = a % b, b 
    return a
for vi in zip(In(), In()):
    for item in ads.items():
        a = gcd(vi[0], item[0])
        ads[a] = min(ads.get(a, 100000000), item[1] + vi[1])

print ads.get(1, -1)


你可能感兴趣的:(简单题,数学,codeforces)