codeforce-1201-C题解
题目:给你一个包含n个整数的数组A(n为奇数),对A做k次以下操作:
- 对数组排序使数组以非递减顺序排列。
- 选取数组的中位数,然后加一
最终使得数组的中位数最大。
输入:第一行输入两个数字 n 和 k ——数组大小和进行的操作次数
输出:输出最大中位数
栗子:输入 3 2
1 3 5
输出 5
(对于这个问题笔者刚开始想的按数组进行二分但是时间复杂度为O(kn)爆了所以更改思路按值进行二分)
思路: 最大中值,那么计算结束数组应该满足--从中间开始到中间后i位的值相等且等于最大中位数。
首先定义一个的右值(右值应大于数组中的每一个元素,只要大于题目中给的1e9即可),求出其中位数。其次判断此中位数是否满足最大中位数的定义,若是,那么左值为此中位数(要求的是最大中位数)。若不是,那么右值为此中位数减一
check函数判断是否满足最大中位数的定义
- bool check(ll mid) // 检查mid是否是真正的中值
- {
- ll s = ;
- for (int i = n / ; i < n; i++) {
- if (mid > A[i]) // A[i] > mid A[i]是不进位的,因为就加不到A[i]那位
- s = s + mid - A[i];
- }
- return (s <= k); // 当s > k时,要成为mid所需要的数比给的数多,则加不到mid那位 所以此mid
- } // 不是中值 此mid大了 如果小点那么可能就是中值了
然后缩小范围找最大中值
- while (l < r) {
- mid = (l + r + ) / ;
- if (check(mid)) // 当mid是中值的时候可以选并且继续求大于mid的值是否满中值
- l = mid;
- else
- r = mid - ; // mid不是中值的时候说明mid太大了,要往小的调
- }
为什么mid = (l+r+1)/2?因为二分搜索一般用向下取整
详细请参考:https://www.cnblogs.com/flipped/p/4991658.html
完整代码:
- #include <iostream>
- #include <algorithm>
- using namespace std;
- typedef long long ll;
- const int maxn = ;
- ll n, k, A[maxn];
- bool check(ll mid) // 检查mid是否是真正的中值
- {
- ll s = ;
- for (int i = n / ; i < n; i++) {
- if (mid > A[i]) // A[i] > mid A[i]是不进位的,因为就加不到A[i]那位
- s += mid - A[i];
- }
- return (s <= k); // 当s > k时,要成为mid所需要的数比给的数多,则加不到mid那位 所以此mid
- } // 不是中值 此mid大了 如果小点那么可能就是中值了
- int main()
- {
- int i;
- ll l = , r = 3e9;
- ll mid;
- scanf_s("%lld%lld", &n, &k);
- for (i = ; i < n; i++)
- scanf_s("%lld", &A[i]);
- sort(A, A + n);
- while (l < r) {
- mid = (l + r + ) / ;
- if (check(mid)) // 当mid是中值的时候可以选并且继续求大于mid的值是否满中值
- l = mid;
- else
- r = mid - ; // mid不是中值的时候说明mid太大了,要往小的调
- }
- printf("%lld", l);
- return ;
- }
笔者建议通过逐步运行加上计算的方法理解此题。
由于笔者才疏学浅,文中难免存在一些错误或疏漏,恳请读者批评指正。
- 添加到短语集
- 没有此单词集: -> 中文(简体)...
- 创建新的单词集...
- 没有此单词集: -> 中文(简体)...
- 拷贝
codeforce-1201-C题解的更多相关文章
- 【38.24%】【POJ 1201】Intervals
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25902 Accepted: 9905 Description You are ...
- Ural 1201 Which Day Is It? 题解
目录 Ural 1201 Which Day Is It? 题解 题意 输入 输出 题解 程序 Ural 1201 Which Day Is It? 题解 题意 打印一个月历. 输入 输入日\((1\ ...
- 今日题解------codeforce 893d
题意:给你一个数列,小于零表示表示信用卡里取出钱,大于零表示信用卡里存钱,等于零表示要查询信用卡, 如果被查到信用卡里的钱小于零,那你就GG,或者在任何时候你的信用卡里的钱大于d的话(不需要找ai等于 ...
- 字符串 kmp算法 codeforce 625B 题解(模板)
题解:kmp算法 代码: #include <iostream>#include <algorithm>#include <cstring>#include < ...
- 【题解】 POJ 1201 Intervals(差分约束)
懒得复制,戳我戳我 Solution: 这道题就是一个板子题 抽象成第\(a\)至第\(b\)间选择数的个数为\(c\),我们就可以用前缀和来表示,这样就可以得到不等式\(s[b]-s[a-1]> ...
- 9.5 考试 第三题 奇袭题解(codeforce 526f)
问题 C: 奇袭 时间限制: 1 Sec 内存限制: 256 MB 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上 要迎来最终的压力测试——魔界入侵. 唯 ...
- yzoj 1201数字三角形3题解
题意 如下图所示为一个数字三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 请编程计算从顶至底部某处的一条路径,使该路径所经过的数字的总和最大.约定: (1)每一步可沿直线向下或右 ...
- CodeForce——Deltix Round, Autumn 2021 (open for everyone, rated, Div. 1 + Div. 2)前三道题目题解
目录 A: B: C: 题目链接 A Divide and Multiply standard input/output 1 s, 256 MB 正在上传-重新上传取消 x13036 B Willia ...
- codevs 1201 最小数和最大数
http://codevs.cn/problem/1201/ 1201 最小数和最大数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题 ...
- poj 1201 Intervals(差分约束)
题目:http://poj.org/problem?id=1201 题意:给定n组数据,每组有ai,bi,ci,要求在区间[ai,bi]内至少找ci个数, 并使得找的数字组成的数组Z的长度最小. #i ...
随机推荐
- 《Java 编写基于 Netty 的 RPC 框架》
一 简单概念 RPC: ( Remote Procedure Call),远程调用过程,是通过网络调用远程计算机的进程中某个方法,从而获取到想要的数据,过程如同调用本地的方法一样. 阻塞IO :当阻塞 ...
- Javaweb Cookie机制
Javaweb Cookie机制 一.前言 HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的 ,浏览器的每一次请求都是完全孤立的,即使 HTTP1.1 支持持续连 ...
- .Net 基于Memcache集群的分布式Session
简述 基于Memcache的Session大家都各有各的说法,比方说:当memcached集群发生故障(比如内存溢出)或者维护(比如升级.增加或减少服务器)时,用户会无法登录,或者被踢掉线等等,每种技 ...
- 持续集成高级篇之Jenkins cli与Jenkins ssh
系列目录 Jenkins Cli介绍 Jenkins Cli为Jenkins提供的一个cli工具,此工具功能非常强大,可以完成诸如重启jenkins,创建/删除job,查看job控制台输出,添加/删除 ...
- urllib爬虫模块
网络爬虫也称为网络蜘蛛.网络机器人,抓取网络的数据.其实就是用Python程序模仿人点击浏览器并访问网站,而且模仿的越逼真越好.一般爬取数据的目的主要是用来做数据分析,或者公司项目做数据测试,公司业务 ...
- FastDFS初印象
是什么? FastDFS是一个轻量级分布式文件系统. 能干嘛? 对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等. 相关概念 ...
- 从入门到入土的JS 随笔day02 新手向
讲讲自增自减和循环语句及三元一次表达式: 一.自增自减实际上就是按照顺序来解读代码, 例如,a++;代表了a先进行了计算,运算完毕后,才进行增加: ++a呢,则是先进行了自增,值加一后再进行运算: 如 ...
- hdu6219 Empty Convex Polygons (最大空凸包板子
https://vjudge.net/contest/324256#problem/L 题意:给一堆点,求最大空凸包面积. 思路:枚举凸包左下角点O,dp找出以这个点为起始位置能构成的最大空凸包面积, ...
- Allegro PCB导入DXF文件详解
一:导入方法 1.确认Allegro PCB的单位精度设置和DXF文件保持一致(一般情况下DXF文件用mm,Allegro文件用mil). 2. 在Allegro中点击File→Import→DXF… ...
- 模板类型推导、auto推导
effective modern c++ 果然是神书,干货满满,简单记录下. item1 模板推倒 典型的模板函数 temlate<class T> void fn(ParamType p ...