问题分析:
先从小到大,给节点排序,然后定义i和j,i为框体左端,j为框体右端,去招待可以框体括到的最远的点j-1,然后令i=j,循环操作。贪心算法。
代码解决部分:
//框体排列
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
int main()
{
int n;cin>>n;
ll width;cin>>width;
vector<int> points(n);//点的集合
for(int i=0;i<n;i++)
{
cin>>points[i];
}
sort(points.begin(),points.end());//默认从小到大
ll ans=0;
ll i= 0,j;
while(i<n)//之前错在写成n-1,序号是0~n-1,如果最后一个点n-1,则要进入循环,有一个框单独框他
{
ans++;//无论如何都要一个框
j=i+1;
while(j<n && points[j]-points[i]<=width)//找到可以框到的最远的点j-1
{
j++;
}
i = j;
}
// cout<<i<<','<<j;
cout<<ans<<endl;
system("pause");
return 0;
}