修围栏

图片说明 图片说明

import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Main {

    public static Long[] a= new Long[20009];
    public static void main(String[] args) {
        Scanner sc  = new Scanner(System.in);
        int n = sc.nextInt();
        PriorityQueue<Long>pq = new PriorityQueue<>();
        long sum=0;
        long ans=0;
        for(int i=0;i<n;i++)
        {
            a[i]=sc.nextLong();
            pq.add(a[i]);
        }
        while(pq.size()!=1)
        {
            Long t1 =pq.peek();
            pq.poll();
            Long t2=pq.peek();
            pq.poll();
            sum = t1+t2;
            ans+=sum;
            pq.offer(sum);
        }
        System.out.println(ans);
    }
}

贪心就要贪到底,没什么好说的,新知识点:优先队列,在队列里的最小的数优先出堆,在while方法中,从小开始计数(8,5,8),先出5和8,ans记下当前的成本13,然后再把13成本,也就没砍的长度放入队列,就是13和8,这样在循环一次就得到最小的成本了,很简单的方法自己一定要会。

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务