题意:
输入n个数x1,x2.....xn,找数A使得|X1-A| + |X2-A| + … … + |Xn-A|的值最小。
思路:
开始的时候直接把目标表达式平方,然后经过一番推导后认为A是Xi的平均数时可以使得表达式的值最小;
后面写出代码后WA了好几发,然后看了一下别人的思路:如果从距离的角度上考虑,将|Xi-A|看成数轴上A到
Xi的距离,那么将X1,Xn,X2,Xn-1...这样两两分组后,就可以知道A取中位数时可以使得上式值达到最小。
将数组从小到大排序后,当n为奇数时,中位数为a[n/2];当n为偶数时,中位数为a[n/2-1]和a[n/2],
并且此时,这两个数之间的数也是满足要求的。
代码如下:
<span style="font-size:18px;">#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1000100];
int main()
{
int i,cnt,n,ans,t,max,min;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
if(n%2)
{
ans=a[n/2];
max=min=a[n/2];
cnt=1;
}
else
{
cnt=a[n/2]-a[n/2-1]+1;
ans=a[n/2-1];
min=a[n/2-1]; max=a[n/2];
}
t=0;
for(i=0;i<n;i++)
{
if(a[i]>=min&&a[i]<=max)
++t;
if(a[i]>max)
break;
}
printf("%d %d %d\n",ans,t,cnt);
}
return 0;
}
</span>