看到這道題,很多人一看到就會立馬想起蠻力法。這道題既然是要求方差,那麼考慮到方差的特性,三個相鄰的數內插補點越小那麼方內插補點也就越小,是以這道題解決的思路應該是先對數組排序,這樣就保證了所選得三個連續得數字拿到得都是內插補點最小得數,然後每三個一組求得最小方內插補點。
C語言版
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[3000];
int c[3000];
int i;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
c[i]=a[i];
}
int temp;
int j;
int min;
for(i=0;i<n-1;i++){//先對數組排序
min=a[i];
int k;
for(j=i+1;j<n;j++){
if(a[j]<min){
min=a[j];
k=j;
}
}
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
double b[3000];
double min_dd;
double avg;
for(i=0;i<n-2;i++){//計算最小平方差儲存數組中
avg=(a[i]+a[i+1]+a[i+2])/3.0;
b[i]=((a[i]-avg)*(a[i]-avg)+(a[i+1]-avg)*(a[i+1]-avg)+(a[i+2]-avg)*(a[i+2]-avg))/3.0;
}
min_dd=b[0];
for(i=1;i<n-2;i++){//找出最小值并輸出
if(b[i]<min_dd){
min_dd=b[i];
}
}
printf("%0.2f\n",min_dd);
return 0;
}
java版
package wu;
import java.util.Scanner;
public class Main{
public static void main (String[]args){
int n;
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
int []a =new int[3000];
int i;
for(i=0;i<n;i++){
a[i]=sc.nextInt();
}
int temp;
int j;
int min;
for(i=0;i<n-1;i++){
min=a[i];
int k=0;
for(j=i+1;j<n;j++){
if(a[j]<min){
min=a[j];
k=j;
}
}
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
double []b =new double[3000];
double min_dd;
double avg;
for(i=0;i<n-2;i++){
avg=(a[i]+a[i+1]+a[i+2])/3.0;
b[i]=((a[i]-avg)*(a[i]-avg)+(a[i+1]-avg)*(a[i+1]-avg)+(a[i+2]-avg)*(a[i+2]-avg))/3.0;
}
min_dd=b[0];
for(i=1;i<n-2;i++){//找出最小值并輸出
if(b[i]<min_dd){
min_dd=b[i];
}
}
System.out.printf("%.2f",min_dd);
}
}