题目大意:构造一个等差数列a',使得最小
由高中数学知识可知该题可转化成求各点的线性回归方程,以求出原式的最小值
线性回归方程求法
指路↓↓↓↓↓↓↓↓↓↓
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "string.h"
#include "iostream"
#include "algorithm"
using namespace std;
const int N=100005;
long long a[N];
namespace GTI
{
char gc(void)
{
const int 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;
int main()
{
long long T;
T=gti();
while(T--)
{
long long n;
n=gti();
for(long long i=1;i<=n;i++)
a[i]=gti();
double x,y=0;
x=(1+n)*n*1.0/2/n;
for(long long i=1;i<=n;i++)
y+=a[i];
y/=n;
double b1=0,b2=0;
for(long long i=1;i<=n;i++)
b1+=(i-x)*(a[i]-y),b2+=(i-x)*(i-x);
b1/=b2;
double aa=y-b1*x,ans=0;
for(long long i=1;i<=n;i++)
ans+=(a[i]-b1*i-aa)*(a[i]-b1*i-aa);
printf("%.15lf\n",ans);
}
return 0;
}
读入使用了题目给的快读,因为精度问题所有int都开了long long