"""
思路: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