【51nod - 1098】 最小方差(基础数学,公式化简,前缀和,积的前缀和)
題干:
若x1,x2,x3……xn的平均數(shù)為k。?則方差s^2 = 1/n * [(x1-k)^2+(x2-k)^2+…….+(xn-k)^2] 。?方差即偏離平方的均值,稱為標(biāo)準(zhǔn)差或均方差,方差描述波動(dòng)程度。?
給出M個(gè)數(shù),從中找出N個(gè)數(shù),使這N個(gè)數(shù)方差最小。?
Input?
第1行:2個(gè)數(shù)M,N,(M > N, M <= 10000)?
第2 - M + 1行:M個(gè)數(shù)的具體值(0 <= Xi <= 10000)?
Output?
輸出最小方差 * N的整數(shù)部分。?
Input示例?
5 3?
1?
2?
3?
4?
5?
Output示例?
2
解題報(bào)告:
? ? 首先想到這題肯定是要排序的,方差就是穩(wěn)定程度嘛,肯定相鄰的兩個(gè)數(shù)好過不相鄰的兩個(gè)數(shù),然后我們進(jìn)行公式化簡:
因?yàn)槲覀冎?#xff0c;數(shù)據(jù)范圍是1e4,所以n^2的復(fù)雜度雖然也可以但是我們還有更優(yōu)秀的nlogn的方法:排序用去了nlogn,所以其他的部分最好在o(n)內(nèi)完成。而我們觀察原公式后發(fā)現(xiàn)如果直接求的話,那每一次遍歷都需要o(m)求一遍k,那就又成o(nm)復(fù)雜度了,和n^2是一個(gè)數(shù)量級(jí)的,肯定不行,所以我們考慮用這一條性質(zhì)巧妙的把k約掉,發(fā)現(xiàn)得出的這兩項(xiàng)剛好滿足前綴和類性質(zhì),于是可以o(1)查詢了,然后o(n-m)遍歷一遍,就可以出答案了。
?
下面上代碼:
#include<bits/stdc++.h> #define ll long long using namespace std; const int MAXN = 1e4+5;ll a[MAXN], sum[MAXN], summ[MAXN]; int main() {int n,m;cin>>n>>m;for(int i=1; i<=n; i++) {scanf("%lld",&a[i]);}sort(a+1, a+1+n);sum[0] = summ[0] = 0;for(int i=1; i<=n; i++) {sum[i] = sum[i-1] + a[i];summ[i] = summ[i-1] + a[i]*a[i];}double minn = (double)LLONG_MAX;for(int i=m; i<=n; i++) {double tmp = (summ[i]-summ[i-m])-1.0*(sum[i]-sum[i-m])*(sum[i]-sum[i-m])/m;minn = min(tmp,minn);}printf("%lld\n",(ll)floor(minn));return 0; }總結(jié):? ?由此我們也知道,不僅是值可以求前綴和,任何一個(gè)我們想知道的值,只要不帶更新操作,都可以求前綴和。
總結(jié)
以上是生活随笔為你收集整理的【51nod - 1098】 最小方差(基础数学,公式化简,前缀和,积的前缀和)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【HDU - 1254 】推箱子 (双b
- 下一篇: 【CodeForces - 349A】C