题目描述:
设x1 , x2 ,…… , xn 是实直线上的n 个点。用固定长度的闭区间覆盖这n 个点,至少需要多少个这样的固定长度闭区间?
对于给定的实直线上的n个点和闭区间的长度k,设计解此问题的有效算法,计算覆盖点集的最少区间数,并证明算法的正确性。
输入:
输入数据的第一行有2 个正整数n和k(n≤10000,k≤100),表示有n个点,且固定长度闭区间的长度为k。接下来的1 行中,有n个整数,表示n个点在实直线上的坐标(可能相同)。
输出:
输出一个整数,表示计算出的最少区间数输出
样例①
输入
7 3
1 2 3 4 5 -2 6
输出
3
代码:
#include<bits/stdtr1c++.h>
using namespace std;
int main() {
int n, k, t, cnt = 0;
set<int> st1;//利用集合元素唯一性、有序性储存节点
cin >> n >> k;
//获取n个数字
for (int i = 0; i < n; i++) {
cin >> t;
st1.insert(t);
}
t = INT_MIN;//用于记录当前放入的固定区间可覆盖的最大坐标
//贪心算法进行处理
for (auto it = st1.begin(); it != st1.end(); it++) {
if (t < *it) {//说明不能覆盖
cnt += 1;//添加固定区间的个数
t = *it + k;//更新当前放入的固定区间可覆盖的最大坐标
}
}
cout << cnt;
return 0;
}
标签:15,个点,覆盖,st1,固定,区间,长度,贪心
From: https://www.cnblogs.com/Fare-well/p/16629458.html