博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1672 区间交(贪心)
阅读量:7063 次
发布时间:2019-06-28

本文共 1699 字,大约阅读时间需要 5 分钟。

1672 区间交

1 秒 131,072 KB 40 分 4 级题

思路:

先按照区间左端点排序

然后维护一个优先队列,存放右端点

循环m个区间

队列共三种操作

  • 把每个区间的右端点加入
  • 如果区间左端点>队列的值,弹出
  • size>k时,弹出至k个
  • 队列每次size为k时,计算区间的和,队列第一个-(当前左端点-1)取最大值

    代码:

package _51_node.greedy;import java.util.Arrays;import java.util.PriorityQueue;import java.util.Scanner;public class ex_1672 {    /**     * 1672 区间交     * 1 秒  131,072 KB 40 分 4 级题     * @param args     */    public static void main(String[] args) {        Scanner cin = new Scanner(System.in);        int n, k, m, x;        n = cin.nextInt();        k = cin.nextInt();        m = cin.nextInt();        long[] sum = new long[n+1];        PriorityQueue
q = new PriorityQueue<>(); Pair[] pair = new Pair[m]; for (int i = 1; i <= n; i++) { x = cin.nextInt(); sum[i] = sum[i - 1] + x; } for (int i = 0; i < m; i++) { pair[i] = new Pair(cin.nextInt(), cin.nextInt()); } Arrays.sort(pair); long ans = 0; for (int i = 0; i < m; i++) { q.add(pair[i].r); while (!q.isEmpty()) { //剔除没有相交区域的 if (q.peek() < pair[i].l) q.poll(); else break; } while (q.size() > k) q.poll();//去除小区间 if (q.size() == k) ans = Math.max(ans, sum[q.peek()] - sum[pair[i].l-1]); } System.out.println(ans); } static class Pair implements Comparable
{ int l; int r; public Pair(int l, int r) { this.l = l; this.r = r; } @Override public int compareTo(Pair o) { if (l > o.l) return 1; return -1; } }}

转载于:https://www.cnblogs.com/somliy/p/10018540.html

你可能感兴趣的文章
Java中文件的上传与下载
查看>>
十大矩阵经典题目(转)
查看>>
【LeetCode】118 & 119 - Pascal's Triangle & Pascal's Triangle II
查看>>
javascript深入理解js闭包
查看>>
博文收藏夹
查看>>
kibana5.6源码分析2
查看>>
strcpy、strcat、strstr的实现
查看>>
MySQL Timeout解析
查看>>
SpringMVC04controller中定义多个方法
查看>>
Ext.Net GridPanel属性配置
查看>>
hdfoo站点开发笔记-2
查看>>
tp剩余未验证内容-2
查看>>
Java反射在JVM的实现
查看>>
Java 存储时间戳的几种方式
查看>>
分享一下自己用c++写的小地图
查看>>
马尔可夫模型
查看>>
bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序
查看>>
js面向对象编程
查看>>
Tensorflow serving的编译
查看>>
JAVA API----Math类和Random类
查看>>