题目:给你一个包含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题解的更多相关文章

  1. 【38.24%】【POJ 1201】Intervals

    Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25902 Accepted: 9905 Description You are ...

  2. Ural 1201 Which Day Is It? 题解

    目录 Ural 1201 Which Day Is It? 题解 题意 输入 输出 题解 程序 Ural 1201 Which Day Is It? 题解 题意 打印一个月历. 输入 输入日\((1\ ...

  3. 今日题解------codeforce 893d

    题意:给你一个数列,小于零表示表示信用卡里取出钱,大于零表示信用卡里存钱,等于零表示要查询信用卡, 如果被查到信用卡里的钱小于零,那你就GG,或者在任何时候你的信用卡里的钱大于d的话(不需要找ai等于 ...

  4. 字符串 kmp算法 codeforce 625B 题解(模板)

    题解:kmp算法 代码: #include <iostream>#include <algorithm>#include <cstring>#include < ...

  5. 【题解】 POJ 1201 Intervals(差分约束)

    懒得复制,戳我戳我 Solution: 这道题就是一个板子题 抽象成第\(a\)至第\(b\)间选择数的个数为\(c\),我们就可以用前缀和来表示,这样就可以得到不等式\(s[b]-s[a-1]> ...

  6. 9.5 考试 第三题 奇袭题解(codeforce 526f)

    问题 C: 奇袭 时间限制: 1 Sec  内存限制: 256 MB 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上 要迎来最终的压力测试——魔界入侵. 唯 ...

  7. yzoj 1201数字三角形3题解

    题意 如下图所示为一个数字三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 请编程计算从顶至底部某处的一条路径,使该路径所经过的数字的总和最大.约定: (1)每一步可沿直线向下或右 ...

  8. 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 ...

  9. codevs 1201 最小数和最大数

    http://codevs.cn/problem/1201/ 1201 最小数和最大数  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze 题解       题 ...

  10. poj 1201 Intervals(差分约束)

    题目:http://poj.org/problem?id=1201 题意:给定n组数据,每组有ai,bi,ci,要求在区间[ai,bi]内至少找ci个数, 并使得找的数字组成的数组Z的长度最小. #i ...

随机推荐

  1. Leetcode之二分法专题-704. 二分查找(Binary Search)

    Leetcode之二分法专题-704. 二分查找(Binary Search) 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 t ...

  2. xcode7中搭建python开发环境

    1. 双击打开Xcode 2. 点击File->New->New Project 3. 在左边的面板选择Other,右边选择External Build Sytem,点击Next 4. 输 ...

  3. Gym - 101667H - Rock Paper Scissors FFT 求区间相同个数

    Gym - 101667H:https://vjudge.net/problem/Gym-101667H 参考:https://blog.csdn.net/weixin_37517391/articl ...

  4. codeforces 811 D. Vladik and Favorite Game(bfs水题)

    题目链接:http://codeforces.com/contest/811/problem/D 题意:现在给你一个n*m大小的图,你输出一个方向之后,系统反馈给你一个坐标,表示走完这步之后到的位子, ...

  5. Requests库整理

    一.Requests库的安装 win平台下,直接在命令行使用 pip install requests 即可进行安装 成功后测试如下 >>> import requests > ...

  6. 用lnmp架构部署wordpress网站详细步骤

    用lnmp架构部署wordpress网站 ①.下载和上传网站代码 用winscp或者xftp, 或者xshell下执行rz命令进行上传网站的包文件. ②.解压程序代码,并将程序代码保存到站点目录,并进 ...

  7. ConcurrentHashMap 的工作原理及代码实现

    ConcurrentHashMap采用了非常精妙的"分段锁"策略,ConcurrentHashMap的主干是个Segment数组.Segment继承了ReentrantLock,所 ...

  8. java架构之路-(源码)mybatis的一二级缓存问题

    上次博客我们说了mybatis的基本使用,我们还捎带提到一下Mapper.xml中的select标签的useCache属性,这个就是设置是否存入二级缓存的. 回到我们正题,经常使用mybatis的小伙 ...

  9. ViewGroup和View

    ViewGroup本身表示容器, 他是View的一个抽象子类, 它可以包含很多个普通的view组件,另外它还可以包含一个ViewGroup容器. 由于它是一个抽象类,所以实际使用中通常使用viewGr ...

  10. Net基础篇_学习笔记_第十天_方法_方法的调用问题

    在Main()函数中,调用Test()函数,我们管Main()函数称之为调用者,管Test()函数称之为被调用者.如果被调用者想要得到调用者的值:1).传递参数.2).使用静态字段来模拟全局变量.如果 ...