参考地址:http://zh.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95
今晚杨大神挂的那套Ural的题可把我们给坑坏了,就这道数学题YY了很久最后的结果是我无法求解.赛后给说了一下是最小二乘法,立即维基百科之,顿时恍然大悟, 最小二乘法求解的目标线性函数正好对应于我们要求的等差数列,真是坑爹啊.更坑爹的是照着最小二乘的方法去求解竟然还WA了几次.题目很是简单,但是通过这体现了自己数学知识储备的严重不足,今年暑假还是去我家旁边那大学去学数学去吧.苦逼的孩子啊...
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 10010;
int arr[maxn], n;
int main() {
double avert, avery;
double b1, b0;
scanf("%d", &n);
avert = avery = 0.0;
for(int i = 1; i <= n; ++i) {
scanf("%d", &arr[i]);
avert += i;
avery += arr[i];
}
avert /= n; avery /= n;
b1 = 0;
double a, b;
a = b = 0;
for(int i = 1; i <= n; ++i) {
a += (i - avert) * (arr[i] - avery);
b += (i - avert) * (i - avert);
}
b1 = a * 1.0 / b;
b0 = avery - b1 * avert;
printf("%.7lf %.7lf\n", b0 + b1, b1);
return 0;
}