博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 1037B Reach Median_贪心
阅读量:4317 次
发布时间:2019-06-06

本文共 1478 字,大约阅读时间需要 4 分钟。

给你一个长度为n的数组a,和一个整数s.

你现在可以将数组中的某个数字+1或者-1(同一个数字可以做任意多次操作),请问你需要做多少次这样的操作,才能使得最后这n个数字的中位数等于s.
保证n为奇数(即保证最后n个数字的中位数是唯一的).
请你输出这个最少的操作次数。Input输入的第一行是两个整数n,s.(1<=n<=2*10^5,1<=s<=10^9)
第二行是n个整数a[1..n](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 首先进行排序,看中位数是否等于s 等于输出0 不等于,看中位数大于还是小于s, 中位数>s: 改中位数为s,同时记录操作次数。因为中位数改小了,所以比它大的还比它大,但比它小的可能会大于它。所以从中位数向左查找,比s大的改为s(操作次数最少),记录操作次数。 中位数
1 #include 
2 #include
3 #include
4 #define ll long long 5 using namespace std; 6 7 const int N = 1e6+10; 8 int a[N]; 9 10 int main()11 {12 #ifdef local13 freopen("in.txt","r",stdin);14 #endif // local15 int n, s;16 cin >> n >> s;17 for(int i = 0; i < n; ++i)18 cin >> a[i];19 sort(a,a+n);20 int mid = n/2;21 ll cost;22 if(a[mid] < s)23 {24 cost = s - a[mid];25 for(int i = mid+1; i < n; ++i)26 if(a[i] < s)27 {28 cost += s-a[i];29 }else break;30 cout << cost;31 }32 else if(a[mid] > s)33 {34 cost = a[mid] - s;35 for(int i = mid-1; i >= 0; --i)36 if(a[i] > s)37 {38 cost += a[i]-s;39 }else break;40 cout << cost;41 }42 else43 puts("0");44 return 0;45 }
View Code

 

转载于:https://www.cnblogs.com/cuimama/p/10293042.html

你可能感兴趣的文章
uclibc,eglibc,glibc之间的区别和联系【转】
查看>>
Java魔法堂:找外援的利器——Runtime.exec详解
查看>>
mysql数据库存放路径
查看>>
TestNG(五)常用元素的操作
查看>>
解决 Visual Studio 点击添加引用无反应的问题
查看>>
通过镜像下载Android系统源码
查看>>
python字符串格式化 %操作符 {}操作符---总结
查看>>
windows 不能在 本地计算机 启动 Apache
查看>>
iOS开发报duplicate symbols for architecture x86_64错误的问题
查看>>
Chap-6 6.4.2 堆和栈
查看>>
【Java学习笔记之九】java二维数组及其多维数组的内存应用拓展延伸
查看>>
C# MySql 连接
查看>>
sk_buff Structure
查看>>
oracle的级联更新、删除
查看>>
多浏览器开发需要注意的问题之一
查看>>
Maven配置
查看>>
HttpServletRequest /HttpServletResponse
查看>>
SAM4E单片机之旅——24、使用DSP库求向量数量积
查看>>
从远程库克隆库
查看>>
codeforces Unusual Product
查看>>