先排序,
考虑最中间的数字和s的大小,如果比s大就把中间和后面所有小于s的数字变成s,比s小同理
一开始用冒泡的感觉做的,没有考虑中间数字和s的大小,wa了半天
#include<bits/stdc++.h> using namespace std; int a[200010]; int main() { int n,s; scanf("%d%d",&n,&s); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } sort(a+1,a+n+1); int mid=n/2+1; int loc=lower_bound(a+1,a+1+n,s)-a; long long res=0; if(loc==mid) res+=abs(s-a[mid]);//不要忘记中间的数字和s的关系,所以用a[mid]和s的大小判断会更好 else if(loc<mid) { for(int i=loc;i<=mid;i++) { res+=(a[i]-s); } } else if(loc>mid) { for(int i=mid;i<loc;i++) { res+=(s-a[i]); } } printf("%lld\n",res); }