AtCoder Beginner Contest 156 比赛人数7003
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;
}
算术平均值,有什么理论根据呢?已证,请看开篇部分。