对于一组 xi 和 yi 计算线性回归方程的公式如下:
题目大意:给定一个数列,将其变成等差数列,修改的代价是
求最小代价
直接套用上面的线性回归方程公式即可。
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
const long long N = 3e5 + 5;
using namespace std;
namespace GTI //快读模板
{
char gc(void)
{
const long long S = 1 << 16;
static char buf[S], *s = buf, *t = buf;
if (s == t) t = buf + fread(s = buf, 1, S, stdin);
if (s == t) return EOF;
return *s++;
}
long long gti(void)
{
long long a = 0, b = 1, c = gc();
for (; !isdigit(c); c = gc())
b ^= (c == '-');
for (; isdigit(c); c = gc())
a = a * 10 + c - '0';
return b ? a : -a;
}
}
using GTI::gti;
long long num[N];
signed main()
{
long long T;
T = gti();
while (T--)
{
long long n = gti();
long long sxy = 0, sx = 0, sy = 0, sx2 = 0;
long double b, a, ans = 0;
for (long long i = 1; i <= n; i++)
{
num[i] = gti();
sxy += i * num[i];
sx += i;
sy += num[i];
sx2 += i * i;
}
b = ((long double)n * sxy - (long double)sx * sy) / ((long double)n * sx2 - (long double)sx * sx);
a = (long double)sy / n - b * sx / n;
long double ai = a;
for (long long i = 1; i <= n; i++)
{
ai += b;
ans += (num[i] - ai) * (num[i] - ai);
}
printf("%.10lf\n", ans);
}
return 0;
}