比较任意两个加速块,哪个在前走的距离更远,根据这个比较维护一个最大堆,最大堆的的元素就是加速块。 在计算的时候最终位移的时候,弹出一个加速块,计算唯一,维持经过这个加速块后的速度,并把经过这个加速块的位移加到最终的位移上去。 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); } }
点赞 评论

相关推荐

牛客网
牛客企业服务