AtCoder Beginner Contest 156 C Rally 一阵紧张 暴力枚举/算术平均值 理论证明

AtCoder Beginner Contest 156

AtCoder Beginner Contest 156 C Rally 一阵紧张     暴力枚举/算术平均值   理论证明

总目录详见https://blog.csdn.net/mrcrack/article/details/104454762

在线测评地址https://atcoder.jp/contests/abc156/tasks/abc156_c

比赛后,算数平均值,补充证明如上。

题目看完,第一直觉,the meeting is held at coordinate计算如下,找出各个坐标的算术平均值即可。

代码很快编好,发现样例2的输出对不上,比赛时一阵紧张

重新读题,发现

1≤N≤100

1≤Xi≤100

还是用最傻,最稳妥的办法,暴利枚举,很快AC,代码如下.对应上图中的374Byte这行。

#include <stdio.h>
int x[105];
int max(int a,int b){
	return a>b?a:b;
}
int min(int a,int b){
	return a<b?a:b;
}
int main(){
	int n,i,ans=10000000,j,mx=0,t;
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",&x[i]),mx=max(mx,x[i]);
	for(j=1;j<=mx;j++){
		t=0;
		for(i=1;i<=n;i++)
			t+=(x[i]-j)*(x[i]-j);
		ans=min(t,ans);
	}
	printf("%d\n",ans);
	return 0;
}

比赛结束后,还是对开会位置的算术平均值计算,念念不忘,考虑到算术平均值可能 不能整除,所有要试两种情况,平均值,

平均值+1。很快代码AC.对应上图中的349Byte这行。

#include <stdio.h>
int x[105];
int min(int a,int b){
	return a<b?a:b;
}
int main(){
	int n,i,ans1=0,ans2=0,avg=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",&x[i]),avg+=x[i];
	avg/=n;
	for(i=1;i<=n;i++)ans1+=(x[i]-avg)*(x[i]-avg);
	avg+=1;
	for(i=1;i<=n;i++)ans2+=(x[i]-avg)*(x[i]-avg);
	printf("%d\n",min(ans1,ans2));
	return 0;
}

算术平均值,有什么理论根据呢?已证,请看开篇部分。

发布了552 篇原创文章 · 获赞 531 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/104455826