python编程练习(二)

一:分苹果

果园里有堆苹果,N(1<N<9)只熊来分。第一只熊把这堆苹果平均分为N份,多了一个,它把多的一个扔了,拿走了一份。第二只熊把剩下的苹果又平均分成N份,又多了一个,它同样把多的一个扔了,拿走了一份,第三、第四直到第N只熊都是这么做的,问果园里原来最少有多少个苹果?
分析
1:3121-1=3120 每人3120/5=624
2:624x4-1=2495 每人2495/5=499
3:499x4-1=1995 每人1995/5=399
4:399x4-1=1595 每人1595/5=319
5:319x4-1=1275 每人1275/5=25 需要找到数字25x4=1020

n = int(raw_input())
i = 0
while True:
    i += 1
    m = i              # 假设n=5,则一直找m使其满足一下循环要求,这里1020满足要求,递增得到m值
    for j in range(n,0,-1):
        if m%(n-1)==0:
            m = m*n/(n-1)+1
        else:
            break
    else:
        break
print m

二:马路上的路灯

一段长度为M的主干道上的一些区域建地铁。要建地铁的这些区域可以用它们在数轴上的起始点和终止点表示,已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的路灯(包括区域端点处的两个路灯)移走。你能帮助小赛计算一下,将这些路灯移走后,马路上还有多少路灯?

M,N=map(int,raw_input().split())
res,flag =0,0
for i in range(N):
    a,b = map(int,raw_input().split())
    if a>=flag:
        res=res+a-flag
    flag=b+1
    # print res,flag
res=res+M+1-flag
print res
"""
>>> 500 3
>>> 100 200
100 201
>>> 150 300
100 301
>>> 360 361
159 362
298=159+500+1-361
"""

三:日期倒计时

输入一个日期格式为yyyy-MM-dd,不考虑日期是否小于今天。输出一个数字表示今天(2015年10月18日)距离该日期还剩多少天。
分析:在剩下的字符排名第几个*剩下字符数的阶乘

"""
hgebkflacdji
set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h', 'k', 'j', 'l']) hgebkflacdji
7 11 279417600
set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'k', 'j', 'l']) gebkflacdji
6 10 21772800
set(['a', 'c', 'b', 'e', 'd', 'f', 'i', 'k', 'j', 'l']) ebkflacdji
4 9 1451520
set(['a', 'c', 'b', 'd', 'f', 'i', 'k', 'j', 'l']) bkflacdji
1 8 40320
set(['a', 'c', 'd', 'f', 'i', 'k', 'j', 'l']) kflacdji
6 7 30240
set(['a', 'c', 'd', 'f', 'i', 'j', 'l']) flacdji
3 6 2160
set(['a', 'c', 'd', 'i', 'j', 'l']) lacdji
5 5 600
set(['a', 'c', 'd', 'i', 'j']) acdji
0 4 0
set(['c', 'd', 'i', 'j']) cdji
0 3 0
set(['d', 'i', 'j']) dji
0 2 0
set(['i', 'j']) ji
1 1 1
set(['i']) i
0 0 0
set([]) 
302715242
"""
mdict = {'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3, 'g': 6, 'f': 5, 'i': 8, 'h': 7, 'k': 10, 'j': 9, 'l': 11}
import math
def func(cordinate, string):
    print cordinate,string
    if string:
        length = len(string)
        less = 0
        for char in cordinate:
            if char < string[0]:
                less += 1
        cordinate.remove(string[0])
        # print less,length-1,less * math.factorial(length - 1)
        return less * math.factorial(length - 1) + func(cordinate, string[1:])
    else:
        return 0
n = int(raw_input())
for i in range(n):
    line = raw_input()
    print func(set("abcdefghijkl"), line) + 1

五:上台阶

有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?
分析:经典题型

def getNum(m):
    if m==2:
        return 1
    elif m==3:
        return 2
    else:
        a,b=1,2
        for i in range(m-3):
            b=a+b
            a=b-a
        return b
n = int(raw_input())
for i in range(n):
    m = int(raw_input())
    print(getNum(m))

六:约会

一大早Bob就从点(0,0)出发,前往约会地点(a,b)。Bob没有一点方向感,因此他每次都随机的向上下左右四个方向走一步。简而言之,如果Bob当前在(x,y),那么下一步他有可能到达(x+1,y),(x-1,y),(x,y+1),(x,y-1)。他昨天花了s步到达了约会地点。
分析:next = s-(abs(a)+abs(b))这个距离要大于0,并且差值是2的倍数

"""
这个要考虑多种情况:
next>0
a,b<0
"""
a,b,s=map(int,raw_input().split())
next = s-(abs(a)+abs(b))
if next%2==0 and next >=0:
    print 'Yes'
else:
    print 'No'

猜你喜欢

转载自blog.csdn.net/qq_27163197/article/details/80864225