【牛客练习赛59】B:牛能和小镇

题目描述

在牛国有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找最短路径,后来发现只要将每两个点之间需要的花费记录下来,并找到最大值与最小值的差即可(也可累积每俩坐标间的花费求和)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值