比较任意两个加速块,哪个在前走的距离更远,根据这个比较维护一个最大堆,最大堆的的元素就是加速块。
在计算的时候最终位移的时候,弹出一个加速块,计算唯一,维持经过这个加速块后的速度,并把经过这个加速块的位移加到最终的位移上去。
import java.util.*;

public class Main {
	private static Scanner input;
	public static void main(String[] args) {
		input = new Scanner(System.in);
		int N = input.nextInt();
		
		PriorityQueue<int[]> queue = new PriorityQueue<>(N, new Comparator<int[]>() {

			@Override
			public int compare(int[] o1, int[] o2) {
				//o1 在 o2 前 
				double l1 = 0.5 * o1[0] * o1[1] * o1[1];
				double v1 = o1[0] * o1[1];
				double l2 = v1 * o2[1] + 0.5 * o2[0] * o2[1] * o2[1];
				// o2 在 o1 前
				double L1 = 0.5 * o2[0] * o2[1] * o2[1];
				double V1 = o2[0] * o2[1];
				double L2 = v1 * o1[1] + 0.5 * o1[0] * o1[1] * o1[1];
				return (int)(l1 + l2 - L1 - L2);//维护一个最大堆
			}}
		);
		
		int[] cell = null;
		for(int i = 0; i < N; i++) {
			cell = new int[2];
			cell[0] = input.nextInt();
			cell[1] = input.nextInt();
			queue.offer(cell);
		}
		
		double distance = 0;
		double x = 0;
		double v = 0;
		while(!queue.isEmpty()) {
			int[] block = queue.poll();
			x = v * block[1] + 0.5 * block[0] * block[1] * block[1];// x = v0 * t + 0.5 * a * t * t
			v = v + block[0] * block[1];		//v = v + a * t  保持经过一个加速块后的速度
			distance += x;
		}
		System.out.printf("%.1f", distance);
	}
	
}