zoukankan      html  css  js  c++  java
  • 区间覆盖问题

    区间覆盖问题

    Time Limit: 1000 ms Memory Limit: 65536 KiB

    Problem Description

    设x1 , x2 ,…… , xn 是实直线上的n 个点。用固定长度的闭区间覆盖这n 个点,至少需要多少个这样的固定长度闭区间?
    对于给定的实直线上的n个点和闭区间的长度k,设计解此问题的有效算法,计算覆盖点集的最少区间数,并证明算法的正确性。

    Input

    输入数据的第一行有2 个正整数n和k(n≤10000,k≤100),表示有n个点,且固定长度闭区间的长度为k。接下来的1 行中,有n个整数,表示n个点在实直线上的坐标(可能相同)。

    Output

    输出一个整数,表示计算出的最少区间数输出。

    Sample Input

    7 3
    1 2 3 4 5 -2 6

    Sample Output

    3

    Hint

     

    Source

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {//思路:就是先把n个点进行排序,设置一个变量存第一个点,如果第一个点加上覆盖的都到不了下一个点,说明还得加一个覆盖才能将这两个点覆盖,
     5     //注意的是一开始就需要有一个覆盖。
     6     priority_queue<int,vector<int>,greater<int> > q;// 从小 到大   排序 使用 优先队列
     7     int n,m,data;// n 点的个数,  m 覆盖区间长度
     8     cin>>n>>m;
     9     for(int i=0;i<n;i++){
    10         cin>>data;
    11         q.push(data);
    12     }
    13     int sum=1;//一开始就需要有一个覆盖  ,开始 的点为 覆盖区间的 开始  point 为指向第一个点
    14     int point=q.top();
    15     while(!q.empty()){
    16         if(point+m<q.top()){//如果  这个点 加上 覆盖长度 到达不了下一个 点 ,说明  这个两个点之间的间距 过大, 不能覆盖,那么这个两个点分别需要 覆盖
    17             sum++;//覆盖个数加一
    18             point=q.top();//更新  覆盖区间 开始的点
    19         }//如果  这个  点  在  上一个点 + 覆盖   的 这个区间内,那么,可以继续下去
    20         q.pop();
    21     }
    22     cout<<sum<<endl;
    23     return 0;
    24 }
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {//思路:就是先把n个点进行排序,设置一个变量存第一个点,如果第一个点加上覆盖的都到不了下一个点,说明还得加一个覆盖才能将这两个点覆盖,注意的是一开始就需要有一个覆盖。
     5     int n,m;
     6     int i,j;
     7     cin>>n>>m;
     8     int a[10002];
     9     for(i=0;i<n;i++){
    10         cin>>a[i];
    11     }
    12     sort(a,a+n);
    13     int num=1;//一开始就需要有一个覆盖  ,开始 的点为 覆盖区间的 开始
    14     int x=a[0];
    15     for(i=1;i<n;i++){
    16         if(a[i]>x+m){//如果  这个点 加上 覆盖到达不了下一个 点 ,说明  这个两个点之间的间距 过大, 不能覆盖,那么这个两个点分别需要 覆盖
    17             num++;
    18             x=a[i];//更新  覆盖区间 开始的点
    19         }//如果  这个  点  在  上一个点 + 覆盖   的 这个区间内,那么,可以继续下去,
    20     }
    21     cout<<num<<endl;
    22     return 0;
    23 }
  • 相关阅读:
    LintCode-174.删除链表中倒数第n个节点
    LintCode-165.合并两个排序链表
    LintCode-371.用递归打印数字
    LintCode-140.快速幂
    LintCode-373.奇偶分割数组
    NOI 2015 品酒大会 (后缀数组+并查集)
    NOI 2016 优秀的拆分 (后缀数组+差分)
    POJ 2774 Long Long Message (后缀数组+二分)
    BZOJ 1717 [USACO06DEC] Milk Patterns (后缀数组+二分)
    POJ 1743 [USACO5.1] Musical Theme (后缀数组+二分)
  • 原文地址:https://www.cnblogs.com/NirobertEinteson/p/11923449.html
Copyright © 2011-2022 走看看