阿里3.30笔试第一题
题目就不说了,其他地方也有,我觉得关键是要自己实现一个大顶堆,如果只用Java.Util包的PriorityQueue,并没有提供直接修改堆内数据的接口,所以要每个元素增加k的话,就要把元素全部弹出来放数组,加完再放回去,我今天这样做然后就超时了😪😪,痛定思痛地回去用数组自己实现了个堆去解。
public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int k = sc.nextInt(); int[] arr = new int[n]; int ans = 0; for(int i=0;i<n;i++){ arr[i] = sc.nextInt(); } BuildHeap(arr); for(int i=0;i<m;i++){ for(int j=0;j<n;j++)//这里可以在堆中直接遍历增加k arr[j] += k; arr[0]/=2;//取堆顶元素除以2 Heapify(arr,0,n);//再次调整堆 } for(int i:arr) ans+=i; System.out.println(ans); } //建立大顶堆 public static void BuildHeap(int[] arr){ for(int i=arr.length/2;i>=0;i--){ Heapify(arr,i,arr.length); } } //调整堆 public static void Heapify(int[] arr,int i ,int len){ int left = i*2+1; int right = i*2+2; int largest = i; if(left<len && arr[left]>arr[largest]) largest = left; if(right<len && arr[right]>arr[largest]) largest = right; if(largest!=i){ swap(arr,i,largest); Heapify(arr,largest,len); } } public static void swap(int[] arr , int a , int b) { int t = arr[a];arr[a]=arr[b];arr[b]=t; }如有错误,希望大佬指正!!