题意:
输入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>