区间覆盖问题

区间覆盖问题

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 }
原文地址:https://www.cnblogs.com/NirobertEinteson/p/11923449.html