求助!!!JAVA最后五个测试用例全TLE惹-……-
查看原帖
求助!!!JAVA最后五个测试用例全TLE惹-……-
500501
howord楼主2022/3/6 23:31

用了一点贪心

import java.util.Scanner;
import java.util.ArrayList;

public class P3389堆 {
	
	ArrayList<Integer> a;
	
	public P3389堆() {

		Scanner sc = new Scanner(System.in);
		
		int times = sc.nextInt();
		
		 a = new ArrayList<Integer>();
		
		for(int i = 1 ;i <= times;i++) {
			int choose = sc.nextInt();
			if(choose == 1) {
				int num = sc.nextInt();
				add(num);
			}else if(choose == 2){
				System.out.println(a.get(0));
			}else if(choose == 3) {
				a.set(0,a.get(a.size()-1));
				a.remove(a.size()-1);
				sort();
			}
		}
	}
	void add(int num) {
		if(a.size()<=0) {
			a.add(num);
			return;
		}
		
		if(num<a.get(0)) {
			int temp = a.get(0);
			a.set(0,num);
			a.add(temp);
		}else {
			a.add(num);
		}
	}
	void sort() {
		if(a.size()<=1) {
			return;
		}
		
		//找到第一个非叶节点
		int len = a.size()/2-1;
		
		//如果最后那个非叶节点只有左孩子,特殊处理
		if(a.size()%2==0) {
			if(a.get(len)>a.get(len*2+1)) {
				int temp = a.get(len);
				a.set(len,a.get(len*2+1));
				a.set(len*2+1,temp);
			}
			len--;
		}
		
		//判断每一个非叶节点
		for(int i = len;i>=0;i--) {
						
			//小根堆
			if(a.get(i)>Math.min(a.get(i*2+1),a.get(i*2+2))) {		
				
					//进行交换
					int temp = a.get(i);
					a.set(i,Math.min(a.get(i*2+1),a.get(i*2+2)));
					if(a.get(i*2+1)>a.get(i*2+2)) {
						a.set(i*2+2,temp);
					}else {
						a.set(i*2+1,temp);
					}			
				}
			}
		}		
	public static void main(String[]args) {
		P3389堆 a = new P3389堆();	
		}
}

2022/3/6 23:31
加载中...