题目描述
在牛国有2个小镇编号1,2,3...n-1,n。用二维平面来表示每个小镇的位置,第个小镇的位置为(xi,yi)。牛能做为牛国的国王,决定给小镇之间建设一些道路,以便于任意小镇之间都能相互到达,在第个小镇和第个小镇之间建设一条道路的花费是:|Xi*Xi*Yi-Xj*Xj*Yj+Yi*Yi*(Yi-2*Xi)-Yj*Yj*(Yj-2*Xj)|但是牛能小气的很,他想最小化建设的费用。
输入描述:
第一行输入一个整数n
接下来n行每行两个整数Xi,Yi表示第i个小镇的坐标。
输出描述:
输出一个整数表示最小的花费。
题解一:PriorityQueue()
1 public static void main(){ 2 Scanner sc=new Scanner(System.in); 3 int n=sc.nextInt(); 4 PriorityQueue<Long> l=new PriorityQueue<Long>(); 5 for(int i=1;i<=n;i++){ 6 long x,y; 7 x=sc.nextLong(); 8 y=sc.nextLong(); 9 l.add((x-y)*(x-y)*y); 10 } 11 long sum=0; 12 long pre=l.poll(); 13 while(!l.isEmpty()){ 14 long now=l.poll(); 15 sum+=Math.abs(now-pre); 16 pre=now; 17 } 18 System.out.println(sum); 19 }
1 public static void main01() { 2 Scanner scan=new Scanner(System.in); 3 int n=scan.nextInt(); 4 long[] a=new long[n]; 5 for(int i=0;i<n;i++) { 6 long x=scan.nextLong(); 7 long y=scan.nextLong(); 8 a[i]=y*(y-x)*(y-x); 9 } 10 Arrays.sort(a); 11 long ans=0; 12 for(int i=1;i<n;i++) { 13 ans+=(a[i]-a[i-1]); 14 } 15 System.out.println(ans); 16 }
经验:
需要搞清楚题目意思,刚开始以为是DFS找最短路径,后来发现只要将每两个点之间需要的花费记录下来,并找到最大值与最小值的差即可(也可累积每俩坐标间的花费求和)