[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 }
View Code

 

 

猜你喜欢

转载自www.cnblogs.com/PYWBKTDA/p/11272232.html
109