4.植物保留【算法赛】 - 蓝桥云课 (lanqiao.cn)
第四题我是这样写的,没过:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],cnt;
int main()
{
int n,m;cin>>n>>m;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[j]-a[i]>=m)
{
cnt++;
}
}
}
cout<<cnt+1<<endl;
return 0;
}
正解是贪心,先排个序.然后从左往右遍历,找当前点下一个要保留的点是哪一个.排序的目的是:
如果当前点不满足条件,那肯定是保留下一个点而不是当前点.因为下一个点经过排序之后值更大,更可能大于m
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],cnt;
int main()
{
int n,m;cin>>n>>m;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
int t=a[0];
cnt=n;
for(int i=1;i<n;i++)
{
if(a[i]-t<m)
{
cnt--;
}
else t=a[i];
}
cout<<cnt<<endl;
return 0;
}