0
点赞
收藏
分享

微信扫一扫

【2020】打地鼠(贪心&双指针)

小飞侠熙熙 2022-07-14 阅读 71


1.题目

给定 n 个整数 a1, a2, …, an 和⼀个 d,你需要选出若干个整数,使得将这些整数从小到大排好序之后,任意两个相邻的数之差都不小于给定的 d,问最多能选多少个数出来。

输入格式
第一行两个整数 n,d (1<=n<=10^5, 0<=d<=10^9),分别表示整数个数和相邻整数差的下界。
第二行 n 个整数 a1, a2, …, an (1<=ai<=10^9, 1<=i<=n),表示给定的 n 个整数。

输出格式
仅一行⼀个整数,表示答案。

样例输入

6 2
1 4 2 8 5 7

样例输出

3

2.思路

审清楚题目,是排序后的相邻两数之差不小于给定值,“不小于”即大于等于!而且可能有多重方案,但题目只需要求出满足方案的数字个数!

只要求数字最多的方案的数字个数,按题目从小到大排序后,其实这里已经暗示可以用​​贪心算法​​了——每次先取出小的,这样后面能计算出数字个数最多的情况。从小的数字开始遍历,设置双指针,快指针​​i​​​和慢指针​​j​​​遍历:
(1)如果满足则快指针和慢指针同进1格;
(2)如果不满足则只用快指针前进1格。

PS:设置的ans是符合要求的组数,所以最后注意ans+1才是数字个数。

3.代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int n,temp;
vector<int>vec;
cin>>n>>temp;
for(int i=0;i<n;i++){
int a;
cin>>a;
vec.push_back(a);
}
sort(vec.begin(),vec.end());

//开干
int j=0;//j是慢指针,i是快指针
int ans=0;
for(int i=1;i<n;i++){
if((vec[i]-vec[j])>=2){
i++;
j++;
ans++;
}else{
i++;
}
}
cout<<ans+1<<endl;
system("pause");
}


举报

相关推荐

0 条评论