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 ...
随机推荐
- C#数据结构_栈和队列
栈:先进后出,只能在栈顶进行操作. 栈的操作主要包括在栈顶插入元素和删除元素.取栈顶元素和判断栈是否为空等. 栈的接口定义: public interface IStack<T> { in ...
- 在.net core web api项目中安装swagger展示api接口(相当于生成api文档)
1, 建立或打开项目后,在“程序包管理器控制台”中执行以下命令添加包引用: Install-Package Swashbuckle.AspNetCore 2,在项目中打开Startup.cs文件,找 ...
- node.js常用的全局成员和对象
一般可以直接调用的对象,我们称之为全局对象: 一下对象都加了console.log(),以在运行环境中的显示效果为标准 //包含文件名称的全路径: console.log(_filename); ...
- Jedis操作Redis--Hash类型
/** * Hash(哈希表) * HDEL,HEXISTS,HGET,HGETALL,HINCRBY,HINCRBYFLOAT,HKEYS,HLEN,HMGET,HMSET, HSET,HSETNX ...
- SpringMVC整合Apache Shiro
关于什么是Shiro,可以查看这篇文章http://www.cnblogs.com/Laymen/articles/6117751.html 一.添加maven依赖 <dependency> ...
- tomcat部署项目,war包问题
tomcat部署项目后,war包是否能删除 答案是能删除的,前提是先停掉tomcat后才能删除 1)在tomcat中webapps目录下上传war包后,对war包自动解压 2)war包不能在tomca ...
- 移位密码(加密+解密)C++实现
移位密码 加密C=Ek(m)=m+k mod 26 解密m=Dk(m)=c-k mod 26 密钥空间|k|=26=|c|=|m| #include<iostream> #include& ...
- 一台Linux服务器可以负载多少个连接?
首先我们来看如何标识一个TCP连接?系统是通过一个四元组来识别,(src_ip,src_port,dst_ip,dst_port)即源IP.源端口.目标IP.目标端口.比如我们有一台服务192.168 ...
- asp.net core系列 72 Exceptionless使用介绍
一.Exceptionless介绍 Exceptionless专注于.net平台提供实时错误和日志报告.主要包括:错误通知.智能分组异常.详细错误报告堆栈跟踪.支持离线.UI查看重要错误和确定优先级. ...
- win10 设定计划任务时提示所指定的账户名称无效,如何解决?
我想把我的 python 爬虫脚本设定为自动定时执行,我的设备是win10 操作系统,这将用到系统自带的计划任务功能.且我希望不管用户是否登录都要运行该定时任务,但在设置计划任务的属性时,遇到一个报错 ...