[noi109]排队
题目要求其实相当于要让大于和小于m的数的个数都不超过n/2,因此当要对一个数处理时,要么把它改成m,要么不作修改,根据这个贪心就可以完成了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 ll n,m,k,y,ans,a[200001]; 5 int main(){ 6 scanf("%lld%lld",&n,&m); 7 for(int i=1;i<=n;i++)scanf("%lld",&a[i]); 8 sort(a+1,a+n+1); 9 k=n/2+1; 10 y=0x3f3f3f3f; 11 for(int i=1;i<=n;i++) 12 if ((a[i]==m)&&(abs(y-k)>abs(k-i)))y=i; 13 if (y==0x3f3f3f3f){ 14 a[n+1]=0x3f3f3f3f; 15 for(int i=0;i<=n;i++) 16 if ((a[i]<m)&&(a[i+1]>m)) 17 if (i>=k)y=i+1; 18 else y=i; 19 } 20 for(int i=k;i<y;i++)ans+=abs(a[i]-m); 21 for(int i=y+1;i<=k;i++)ans+=abs(a[i]-m); 22 printf("%lld",ans); 23 return 0; 24 }