区间覆盖问题
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
设x1 , x2 ,…… , xn 是实直线上的n 个点。用固定长度的闭区间覆盖这n 个点,至少需要多少个这样的固定长度闭区间?
对于给定的实直线上的n个点和闭区间的长度k,设计解此问题的有效算法,计算覆盖点集的最少区间数,并证明算法的正确性。
对于给定的实直线上的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 }