CF1904C的题解

(一)

不太好想。(我看了题解才会

  1. \(k>2\) 时,可以选两次相同的 \(i\)\(j\)。再将生成的数做差。

  2. \(k=1\) 时,直接 \(Θ(n^2)\) 枚举。

  3. \(k=2\) 时,先枚举第一次的 \(i\)\(j\),再用 lower_bound() 实现查找第二次选择的数。时间复杂度 \(Θ(n^2\log_2{n})\)

注意:当 \(k=2\) 时,仍要考虑 \(k=1\) 时的情况。当 \(k=1\)\(k=2\) 时,考虑不操作的最小值。

(二)

AC 代码。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,k,a[2010];
signed main(){
	scanf("%lld",&t);
	while(t--){
		scanf("%lld%lld",&n,&k);
		int ans=2e18;
		for(int i=1;i<=n;i++)scanf("%lld",&a[i]),ans=min(ans,a[i]);
		sort(a+1,a+n+1);
		if(k>2){
			puts("0");
			continue;
		}
		for(int i=1;i<=n;i++)
			for(int j=i+1;j<=n;j++)
				ans=min(ans,a[j]-a[i]);
		if(k==2){
			for(int i=1;i<=n;i++)
				for(int j=i+1;j<=n;j++){
					int s=a[j]-a[i];
					int pos=lower_bound(a+1,a+n+1,s)-a;
					if(pos>1)ans=min(ans,abs(a[pos-1]-s));
					if(pos<=n)ans=min(ans,abs(a[pos]-s));
				}
		}
		printf("%lld\n",ans);
	}
	return 0;
}
posted @ 2024-03-27 12:25  Jerry_heng  阅读(18)  评论(0)    收藏  举报