题目大意:有n个数,每次操作可以使一个数+1或-1,问至少多少次操作后可以使得其中的三个数相等。
1<=n<=300,1<=a[i]<=1e9
思路:给三个数,要使他们相等,最少的操作次数就是他们的差分之和,所以我们先对数组进行排序,然后求出差分数组,同时维护相邻差分数值之和的最小值
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 305;
int a[N], b[N];
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
scanf_s("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf_s("%d", &a[i]);
}
sort(a + 1, a + n + 1);
int mi = 0x7fffffff;
for (int i = 2; i <= n; i++)
{
b[i] = a[i] - a[i - 1];//求差分
if (i != 2)//同时维护相邻差分和最小值
{
mi = min(mi,b[i] + b[i - 1]);
}
}
printf("%d\n", mi);
}
return 0;
}