看到这道题,很多人一看到就会立马想起蛮力法。这道题既然是要求方差,那么考虑到方差的特性,三个相邻的数差值越小那么方差值也就越小,所以这道题解决的思路应该是先对数组排序,这样就保证了所选得三个连续得数字拿到得都是差值最小得数,然后每三个一组求得最小方差值。
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);
}
}