面试题整理

"""
思路:sum1计算小妞妞的得分,sum2计算牛牛的得分;
每次选择时,如果对方最大值比自己的最大值还大,就删除对方的;如果没有自己的最大值大,
或者对方空了,就加上自己的最大,
然后删除自己的最大。
每次结束后,交替两个数组
"""
arr1=[2,7,7]
arr2=[2,8,7]
length=len(arr1)
i=0
sum1,sum2=0,0
for i in range(2*length):
    if not arr2 or (arr1 and max(arr1)>=max(arr2)):
        if i%2==0:
            sum1+=max(arr1)
        else:
            sum2+=max(arr1)
        arr1.remove(max(arr1))
    else:
        arr2.remove(max(arr2))
    arr1,arr2=arr2,arr1
    print(sum1-sum2)

4.07 腾讯(1-80% ,2-0%,3-20%)

1题:给定一个整数n和可差分的次数k,每次操作减一或者拆分,则消去n的最少操作轮数

做的时候,只过了80%。每次只考虑差分剩下的最大值,但忘了一种情况,拆分的终止情况是n<=2,否则n将一直拆分下去,1->0+1....

        res=n
        count+=1
        for i in range(k):
            if i<=2:
                break
            res=res//2+1 if res%2!=0 else res//2
            count+=1
        print (count+res)

2题:

#这种解答是建立在供需平衡的基础上的,也就是和为零[-5,-2,7],和不为零时不是最优解
def costnum(n, l):
    costsum = abs(l[0])  #从头开始
    for i in range(1,len(l)):
        l[i] += l[i-1] #依次计算从改点向后运的总费用,前面的一定也是从当前运过去
        costsum += abs(l[i]) #累加
    return costsum

n = int(input())
l = [int(i) for i in input().split()]
print(costnum(n, l))

3 题:给定一个数组长度是n和操作的次数k,每次操作是:输出当前数组的非零最小值,然后所有非零元素减去最小值,如果全部都是零,则输出零。

思路:每次操作选出最小值,然后循环减去最小值,复杂度太高O(n*k)。看了网上的一个答案才发现,其实返回的就是排好序后相邻两数的差值。因为不管前面减了多少,所有减完的结果一定是把前一个数减为零了,所以减的总数就是前一个数的值。用当前数减去前一个数就ok了(注意保证非零,所以读取数据的时候就直接把零剔除然后排序)

 

5.15 模拟

1 只过了50% 超时

import sys
n = int(sys.stdin.readline().strip())
place=[]
for i in range(n):
    temp=[]
    line = sys.stdin.readline().strip()
    values = list(map(int, line.split()))
    #for v in values:
        #temp.append(v)
    place.append(values)
ask=[]
m=int(sys.stdin.readline().strip())
for i in range(m):
    temp=[]
    line = sys.stdin.readline().strip()
    values = list(map(int, line.split()))
    #for v in values:
        #temp.append(v)
    ask.append(values)
def f(place,ask):
    if abs(place[0]-ask[0])+abs(place[0]-ask[2])==abs(ask[0]-ask[2]):
        if abs(place[1]-ask[1])+abs(place[1]-ask[3])==abs(ask[1]-ask[3]):
            return True
    return False

for j in range(m):
    count=0
    for i in range(n):
        #if abs(place[i][0]-ask[j][0])+abs(place[i][0]-ask[j][2])==abs(ask[j][0]-ask[j][2]):
            #if abs(place[i][1]-ask[j][1])+abs(place[i][1]-ask[j][3])==abs(ask[j][1]-ask[j][3]):
        if f(place[i],ask[j]):
            count+=1
    print count

2 超时 30%

import sys
line = list(map(int,sys.stdin.readline().strip().split()))
n=line[0]
m=line[1]
k=line[2]
schemes=[]
for i in range(m):
    temp=[]
    line = sys.stdin.readline().strip()
    values = list(map(int, line.split()))
    #for v in values:
        #temp.append(v)
    schemes.append(values)
"""
def price(schemes,k,N):
    res=k*N
    m=len(schemes)
    for i in range(m):
        if schemes[i][1]<=N:
            new_N=N-schemes[i][1]
            temp=price(schemes,k,new_N)+schemes[i][0]
            res=min(res,temp)
    return res
a=price(schemes,k,n+1)
print(a)
"""
class A(object):
    def price(self,schemes,k,N):
        res=k*N
        m=len(schemes)
        for i in range(m):
            if schemes[i][1]<=N:
                new_N=N-schemes[i][1]
                temp=self.price(schemes,k,new_N)+schemes[i][0]
                res=min(res,temp)
        return res
#a=A()
print A().price(schemes,k,n+1)

3  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值