一:题目
设 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
加油 宝!!!!!!!!!!!!!!!