(一)
不太好想。(我看了题解才会)
-
当 \(k>2\) 时,可以选两次相同的 \(i\) 和 \(j\)。再将生成的数做差。
-
当 \(k=1\) 时,直接 \(Θ(n^2)\) 枚举。
-
当 \(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;
}
标签:int,题解,scanf,CF1904C,long,ans,lld
From: https://www.cnblogs.com/Jh763878/p/18098710