[USACO] 1.3.5 Combination Lock 号码锁 Python

1.3.5 Combination Lock 号码锁

农夫约翰的奶牛不停地从他的农场中逃出来,导致了很多损害。为了防止它们再逃出来,他买了一只很大的号码锁以防止奶牛们打开牧场的门。

农夫约翰知道他的奶牛很聪明,所以他希望确保它们不会在简单地试了很多不同的号码组合之后就能轻易开锁。锁上有三个转盘,每个上面有数字  1~n ,因为转盘是圆的,所以 1 和 n 是相邻的。有两种能开锁的号码组合,一种是农夫约翰设定的,还有一种 “预设” 号码组合是锁匠设定的。但是,锁有一定的容错性,所以,在每个转盘上的数字都与一个合法的号码组合中相应的数字相距两个位置以内时,锁也会打开。

比如说,如果农夫约翰的号码组合是 (  1, 2 , 3 ),预设号码组合是 ( 4 , 5 , 6 ),在转盘被设定为 ( 1 , 3 , 5 )(因为这和农夫约翰的号码组合足够接近)或 ( 2 , 4 , 8 )(因为这和预设号码组合足够接近)时可以打开锁。注意,( 1 , 5 , 6 ) 并不会打开锁,因为它与任一号码组合都不够接近。

给出农夫约翰的号码组合和预设号码组合,请计算能够开锁的不同的号码组合的数目。号码是有序的,所以 ( 1 , 2 , 3 ) 与 ( 3 , 2 , 1 ) 不同。

输入格式:

输入的第一行是一个整数 n,代表锁上的数字个数。

输入的第二行有三个整数 x, y, z,代表农夫约翰的号码组合。

输入的第三行有三个整数 a, b, c,代表预设的号码组合。

输出格式:

输出一行一个整数代表能够开锁的组合数目。

数据范围:

对于 100% 的数据,保证 1 ≤ n ≤ 100,1 ≤ x, y, z, a, b, c ≤ n。

样例输入:
50
1 2 3
5 6 7
样例输出:
249
提示:

输入输出样例 1 解释
每个转盘的标号是1 ~ 50。农夫约翰的号码组合是 ( 1 , 2 , 3 ),预设号码组合是 ( 5 , 6 , 7 )。

时间限制: 1000ms
空间限制: 256MB

=====Analysis=====

这道题其实和之前的一道题很像(破碎的项链)

由于这个这密码锁是环形的,所以需要把 1-n 个数放在一个列表并乘以3来模拟一个圆形密码锁(当然也可以使用链表)

在使用循环的时候只需要记住一个不等式就行了:

x -2 \leqslant x \leqslant x+2

注:这道题很明显是使用动态规划来做

当然这是我自己的做法,不喜勿喷

=====Code=====

这里的注释使用的是 EXAMPLE 的数据

fin = open('combo.in','r')
fout = open('combo.out','w')
lines = fin.read().splitlines()
N = int(lines[0])
john_code = tuple(map(int,(lines[1].split())))   #john = (1, 3, 5)
preset_code = tuple(map(int,(lines[2].split())))    #preset = (5, 6, 7)

def code(N,person_code,code,number_list):
    for i in range(N-1+person_code[0]-2,N+person_code[0]+2): #number_list[N] = 1, [N-1] = 50
        for j in range(N-1+person_code[1]-2,N+person_code[1]+2):
            for g in range(N-1+person_code[2]-2,N+person_code[2]+2):
                code.append((number_list[i],number_list[j],number_list[g]))

def combo(N,john_code, preset_code):
    if N == 1:
        fout.write('1\n')
    else:
        number_list = [i for i in range(1,N+1)]*3
        print(number_list)
        code_list = []
        code(N, john_code, code_list,number_list)
        code(N, preset_code, code_list,number_list)
        code_list = set(code_list)
        fout.write(f'{len(code_list)}\n')
    fout.close()

combo(N,john_code,preset_code)

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值