题目链接:
http://codeforces.com/problemset/problem/1037/B
B. Достигнуть медианы
ограничение по времени на тест1 секунда
ограничение по памяти на тест256 мегабайт
вводстандартный ввод
выводстандартный вывод
Вам дан массив aa, состоящий из nn чисел и число ss. Гарантируется, что nn является нечётным.
За одно действие вы можете понизить или повысить любой элемент на один. Вычислите минимальное количество действий, которое нужно проделать, чтобы сделать медиану массива равной ss.
Медиана массива нечётной длины определяется как значение элемента, который будет расположен на центральной позиции после сортировки массива. Например, медиана массива 6,5,86,5,8 равна 66, потому что если мы отсортируем этот массив, то мы получим 5,6,85,6,8, и 66 расположена на центральной позиции.
Входные данные
Первая строка содержит два целых числа nn и ss (1≤n≤2⋅105−11≤n≤2⋅105−1, 1≤s≤1091≤s≤109) — длина массива и требуемое значение медианы.
Вторая строка содержт nn целых чисел a1,a2,…,ana1,a2,…,an (1≤ai≤1091≤ai≤109) — элементы массива aa.
Гарантируется, что nn является нечётным.
Выходные данные
В единственной строке выведите минимальное количество действий которое нужно проделать, чтобы сделать медиану равной ss.
Примеры
входные данныеСкопировать
3 8
6 5 8
выходные данныеСкопировать
2
входные данныеСкопировать
7 20
21 15 12 11 20 19 12
выходные данныеСкопировать
6
Примечание
В первом примере 66 можно увеличить дважды. Тогда массив превратится в 8,5,88,5,8, который становится равным 5,8,85,8,8 после сортировки, значит медиана равна 88.
Во втором примере можно один раз увеличить 1919 и пять раз увеличить 1515. Тогда массив становится равным 21,20,12,11,20,20,1221,20,12,11,20,20,12. Если его отсортировать, то получится 11,12,12,20,20,20,2111,12,12,20,20,20,21, а значит медиана равна 2020.
B 达到中位数
Time limit1000 ms | Memory limit262144 kB |
---|
给你一个元素个数为n的数组a , 和一个整数s.(保证n为奇数 。)
你可以将数组中的任一个数字+1或者-1(同一个数字可以做任意多次操作),请问你最少需要做多少次这样的操作,才能使得这n个数字的中位数等于s.
请你输出这个最少的操作次数。
Input
输入的第一行是两个整数n,s.(1<=n<=2*105,1<=s<=109)
第二行是n个整数a1…an(1<=ai<=10^9).
保证n为奇数。
Output
输出只有一行,即最少的操作次数。
Examples
Input
3 8
6 5 8
Output
2
Input
7 20
21 15 12 11 20 19 12
Output
6
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
int n, s, a[200005];
while(scanf("%d%d", &n, &s)!=EOF)
{
for(int i=0; i<n; i++)
scanf("%d", &a[i]);
sort(a, a+n);
ll ans=0;
int ind=lower_bound(a, a+n, s)-a;//找到第一个<=s的数的下标
if(ind<=n/2)
{
for(int i=ind; i<=n/2; i++)//将ind到n/2之间的数全部变成s,这样操作最少且满足条件
ans+=a[i]-s;//累加差值即可
}
else
{
for(int i=n/2; i<ind; i++)
ans+=s-a[i];
}
printf("%lld\n", ans);
}
return 0;
}