CodeForces -1037B 达到中位数

题目链接:
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 msMemory 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值