一:题目
设 x
1
,x
2
,…,x
n
是实直线上的n个点。用固定长度的闭区间覆盖这n个点,至少需要多少个这样的固定长度闭区间?
输入格式:
第1行有2个正整数n(n<50)和k,表示有n个点,且固定长度闭区间的长度为k。
接下来的1行中有n个整数 a
i
(−2000<a
i
<2000) ,表示n个点在实直线上的坐标(可能相同)。
输出格式:
最少区间数。
输入样例:
7 3
1 2 3 4 5 -2 6
输出样例:
3
二:思路:
思路:
1.首先先排序
2.然后确定第一个元素为标杆,让后一个元素减去前一个元素,如果其大于等于k,那么
区间数加一,且标杆更新为减去前一个元素使其大于等于k的元素;
3.但要对最后不满足条件的元素单独处理
三:上码
/**思路:1.首先先排序2.然后确定第一个元素为标杆,让后一个元素减去前一个元素,如果其大于等于k,那么区间数加一,且标杆更新为减去前一个元素使其大于等于k的元素;3.但要对最后不满足条件的元素单独处理 */#include<bits/stdc++.h>
using namespace std;int main(){int N,k;vector<int> v;cin >> N >> k;for(int i = 0; i < N; i++){int nums;cin >> nums;v.push_back(nums);}sort(v.begin(),v.end());int temp = v[0];int count = 0;for(int i = 1; i < N; i++){if(v[i] - temp >= k){temp = v[i];count++;// cout << temp << "wyj";}if(v[N-1] - temp < k && i != N-1){ //这里是为了处理剩余的元素也得占一个区间但其不满足上一个if条件 count++; //但如果是最后一个元素那就不用统计进去了 break;} }//count++;cout << count;} //测试用例1
//7 3
//1 2 3 4 10 -2 20//测试用例2
//7 3
//1 2 3 4 5 -2 6
加油 宝!!!!!!!!!!!!!!!