蓝桥杯 4.植物保留【算法赛】 题型:贪心

69 阅读1分钟

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;
} 

image.png

正解是贪心,先排个序.然后从左往右遍历,找当前点下一个要保留的点是哪一个.排序的目的是:

如果当前点不满足条件,那肯定是保留下一个点而不是当前点.因为下一个点经过排序之后值更大,更可能大于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;
}

image.png