記錄了初步解題思路 以及本地實現代碼;并不一定為最優 也希望大家能一起探討 一起進步
目錄
- 9/1 1792. 最大平均通過率
- 9/2 3025. 人員站位的方案數 I
- 9/3 3027. 人員站位的方案數 II
- 9/4 3516. 找到最近的人
- 9/5 2749. 得到整數零需要執行的最少操作數
- 9/6 3495. 使數組元素都變為零的最少操作次數
- 9/7 1304. 和為零的 N 個不同整數
9/1 1792. 最大平均通過率
提高平均通過率
盡量進入加一人通過率提高最多的班級
heap存放通過率提高量
def maxAverageRatio(classes, extraStudents):""":type classes: List[List[int]]:type extraStudents: int:rtype: float"""def cal(p,t):return 1.0*(p+1)/(t+1)-1.0*p/timport heapqh = []total = 0for p,t in classes:total += 1.0*p/th.append((-cal(p,t),p,t))heapq.heapify(h)for _ in range(extraStudents):v,p,t = heapq.heappop(h)total -= vheapq.heappush(h, (-cal(p+1,t+1),p+1,t+1))return total/len(classes)
9/2 3025. 人員站位的方案數 I
A=x1,y1 B=x2,y2
橫坐標從小到大排序 滿足前面的點在后面的點左側
滿足y1>=y2
對于中間的點 需要 y>y1 或 y<y2
遍歷時記錄右下的最大maxy
def numberOfPairs(points):""":type points: List[List[int]]:rtype: int"""points.sort(key=lambda x:(x[0],-x[1]))ans=0for i,(_,y1) in enumerate(points):maxy=float('-inf')for _,y2 in points[i+1:]:if y1>=y2>maxy:maxy=y2ans+=1return ans
9/3 3027. 人員站位的方案數 II
A=x1,y1 B=x2,y2
橫坐標從小到大排序 滿足前面的點在后面的點左側
滿足y1>=y2
對于中間的點 需要 y>y1 或 y<y2
遍歷時記錄右下的最大maxy
def numberOfPairs(points):""":type points: List[List[int]]:rtype: int"""points.sort(key=lambda x:(x[0],-x[1]))ans=0for i,(_,y1) in enumerate(points):maxy=float('-inf')for _,y2 in points[i+1:]:if y1>=y2>maxy:maxy=y2ans+=1return ans
9/4 3516. 找到最近的人
計算兩人到z的距離
def findClosest(x, y, z):""":type x: int:type y: int:type z: int:rtype: int"""d1=abs(x-z)d2=abs(y-z)if d1>d2:return 2elif d1<d2:return 1else:return 0
9/5 2749. 得到整數零需要執行的最少操作數
def makeTheIntegerZero(num1, num2):""":type num1: int:type num2: int:rtype: int"""k=1while True:x=num1-num2*kif x<k:return -1if k>=x.bit_count():return kk+=1
9/6 3495. 使數組元素都變為零的最少操作次數
除以4等同于 二進制右移兩位
對于一個二進制x位的數 需要操作(x+1)//2次
累加所有數操作次數 除以2
find(num)累加1~num的所有操作次數
def minOperations(queries):""":type queries: List[List[int]]:rtype: int"""def find(num):i=1base=1cnt=0while base<=num:cnt+=((i+1)//2)*(min(base*2-1,num)-base+1)i+=1base*=2return cntans=0for q in queries:ans+=(find(q[1])-find(q[0]-1)+1)//2return ans
9/7 1304. 和為零的 N 個不同整數
n為奇數則添加一個0 然后-x,x成對添入
def sumZero(n):""":type n: int:rtype: List[int]"""ans=[]if n%2==1:ans=[0]for i in range(1,n//2+1):ans.append(-i)ans.append(i)return ans