本题如果想让极差最小的话,一定是先排好序,从小到大选

这时候我们可以用滑动窗口来做

滑动窗口步骤:

step1;初始化:初始化l=1,r=1,然后用num记录画的数目,ret记录差值和

step2:进窗口 num++,如果是第一幅画的话不记录差值,如果不是第一幅的话计算差值加入ret

step3:判断+出窗口

如果num==m,记录结果

出窗口:ret-=a[l+1]-a[l] l++

好的,我们来写一下代码

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
typedef long long ll;
ll n,m;
ll a[N];
int main()
{
	cin >> n >> m;
	for(int i = 1;i<=n;i++)
	{
		cin >> a[i];
	}
	sort(a+1,a+1+n);
	
	ll l = 1,r = 2;
	ll sum = 0;
	ll ret = 1e20;
	while(r<=n)
	{
		sum=sum+abs(a[r]*a[r]-a[r-1]*a[r-1]); 
		while(r-l+1 == m)
		{
			ret=min(ret,sum);
			sum=sum-abs(a[l+1]*a[l+1]-a[l]*a[l]);
			l++;
		}
		
		r++;
	}
	cout << ret;
	
	return 0;
}

更多推荐