python编程练习(五)

一:喷水装置

长为20米,宽为2米,妈妈要他给草坪浇水,在草坪上放置半径为Ri的喷水装置,输入第一个数字为喷水装置的个数n,后面n个数字分别为n个喷水装置的半径r,r表示该喷水装置能覆盖的圆的半径【5 | 2 3.2 4 4.5 6】。

arrin = map(float,raw_input().split())
n = int(arrin[0])
arr = arrin[1:]
arr.sort(reverse=True)
l=20
count,i = 0,0
while i<n and l>0:
    if l<=0:
        pass
    if arr[i]>=2**0.5:
        count+=1
        l=l-2*(arr[i]**2-1)**0.5
        i+=1
    else:
        count+=2
        r = max(arr[i],arr[i+1])
        l=l-2*(r**2-1)**0.5
        i+=2
print count

二:拦截导弹

虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于等于前一发的高度,输出最多能拦截的导弹数目。

# 389 207 155 300 299 170 158 65
#  1   2   3   2   3   4   5   6
N=int(raw_input())
for _ in range(N):
    m=int(raw_input())
    arr=map(int,raw_input().split())
    res=[1]*m
    for i in range(1,m):    # 对于每一个数,把后面所有的书都更新一次
        for j in range(i):
            if arr[i]<arr[j]:
                res[i]=max(res[i],res[j]+1)
    print max(res)

三:商队运输费

在运输过程中G商队发现,如果不在某个城市停下来休整,在连续行进过程中,他们所花的运输费与他们已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他们花费的运输费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。

# 构造一个矩阵图
def cal(n):
    if n == 0:
        return 0
    else:
        return cal(n-1)+10+n
n = int(raw_input())
l = []
for i in range(n-1):
    p,q,d = map(int,raw_input().split())
    l.append([p,q,d])
v = [[9999 for _ in range(n+1) ] for j in range(n+1)]
for i in range(1,n+1):
    v[i][i] = 0
for item in l:
    v[item[1]][item[0]] = item[2]
    v[item[0]][item[1]] = item[2]
for k in range(1,n+1):
    for i in range(1,n+1):
        for i in range(1,n+1):
            if (v[i][j]>v[i][k]+v[k][j]):  # 在走距离最近的方法中找到可能运输费最贵的方法
                v[i][j] = v[i][k]+v[k][j]
# 第一步
max = 0
for i in range(1,n+1):
    for j in range(1,n+1):
        if v[i][j]!=9999:
            res = v[i][j]
            if res> max:
                max = res
# 第二步
print cal(max)
# 结果----------------------------------
"""
5         # 输入的第一行包含一个整数n,表示包括首都在内的王国的城市数
1 2 2     # 城市从1开始依次编号,1号城市为首都。
1 3 1     # 每行三个整数Pi, Qi, Di,表示城市Pi和城市Qi之间有一条高速路,长度为Di千米。
2 4 5
2 5 4
# 第一步
[[9999, 9999, 9999, 9999, 9999, 9999], 
 [9999, 0,    2,    1,    9999, 6], 
 [9999, 2,    0,    9999, 5,    4], 
 [9999, 1,    9999, 0,    9999, 9999], 
 [9999, 9999, 5,    9999, 0,    9], 
 [9999, 9999, 4,    9999, 9999, 0]]
# 第二步
[[9999, 9999, 9999, 9999, 9999, 9999], 
 [9999, 0,    2,    1,    9999, 6], 
 [9999, 2,    0,    9999, 5,    4], 
 [9999, 1,    9999, 0,    9999, 9999], 
 [9999, 9999, 5,    9999, 0,    9], 
 [9999, 9999, 4,    9999, 9999, 0]]
"""

四:字符判断

判断字符串b的所有字符是否都在字符串a中出现过,a、b都是可能包含汉字的字符串。b中重复出现的汉字,那么a中也要至少重复相同的次数。汉字使用gbk编码(简单的说,用两个字节表示一个汉字,高字节最高位为1的代表汉字,低字节最高位可以不为1)。

a=list(raw_input())
b=list(raw_input())
b1=set(b)
def dels(a,b,b1):
    for i in b1:
        if a.count(i)<b.count(i):
            return False
    return True
if dels(a,b,b1):
    print 1
else:
    print 0

五:将功赎过

这个数字的十进制范围是l~r,且这个数的二进制表示中恰有m个1【比如1 4 2】,最坏情况下,要试多少次得到这个数字。

l,r,m=map(int,raw_input().split())
res=0
for i in range(l,r+1):
    if m == bin(i).count('1'):
        res +=1
if res>0:
    print res
else:
    print '-1'

六:超市购物

超市内有n件物品,第i(1<=i<=n)件物品的价值为ai,但是他能拿的物品的价值总和不能超过V。贪心的小易希望能拿尽量多数量的物品,那么请你帮他计算下他最多能拿到多少件物品?

# 这种题目碰到n,V=100000,500000;arr里面的值都是2,这种情况占用所有内存
# while比for循环更占内存?
# while True:
#     n,V=map(int,raw_input().split())
#     arr=map(int,raw_input().split())
#     arr.sort()
#     num,allsum=0,0
#     while allsum<=V:
#         allsum+=arr[num]
#         num+=1
#     print num-1
while True:
    n,V=map(int,raw_input().split())
    arr=map(int,raw_input().split())
    arr.sort()
    num,allsum=0,0
    for i in range(n):
        if allsum+arr[i]<V:
            allsum+=arr[i]
            num+=1
    print num

猜你喜欢

转载自blog.csdn.net/qq_27163197/article/details/80886779
今日推荐