[每日一题2020.06.11]Codeforces Round #644 (Div. 3) H
A-E见 : 这里
我觉得很有必要把H拿出来单独发( 其实是今天懒得写题了 )
problem H
一个从 1 到 $ 2^m - 1$ 的长度为m的连续二进制序列, 删去指定的n个数, 问剩余的数的中位数是多少
看了题解还琢磨了一个小时才懂, 绝不能跟着题目傻傻的暴力来写
主要的思想还是动态调整的思想
首先比如我们制定m = 3
得到一串序列转换为十进制就是 0 1 2 3 4 5 6 7, 该怎么删才能在不用遍历的情况下找到中位数呢?
( 这题肯定不能暴力, 给定的m = 60, $ 2^{60} = 1152921504606846976 $ )
我们这里用一种动态维护的方式 :
比如n=3, m=3, 删去001, 011, 111
- 先不管三七二十一, 删去最末尾的那n个数, 判断假设这样删除的话最后的中位数是几

- 将删除队列从小到大排序, 依次维护调整 比如这里是1, 3, 7
- 假如删除的为比目前所指向的值大的数, 则不用调整 why ? 见图 :

可以看到, 只要删除的数是比目前所指向的大的数, 中位数都是现在这个数, 不用变.
- 假如删除的为小于或等于目前所指向的值的数, 则指针++ why ? 见图 :

比如我们删除1, 那么相当于原本假设的删除的最后三个数少了一个, 前面增加了一个, 则删除后序列的中间值为现在的值+1 .
我们将3, 7继续删除 :


由于原本的值是从0连续的, 所以直接输出最后指针pos的值的二进制形式即为答案.
tips : 见到这种题, 一定要好好想想位置的计算, 很容易出现错误 !
pos的位置 :

ac代码 :
/*
* Author: RoccoShi
* Time: 2020-06-10 20:05:02
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[105];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while(t--) {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; ++i)
{
string s;
cin >> s;
ll tmp = 0;
for (int j = 0; j < m; ++j)
{
tmp = tmp*2 + s[j] - '0'; // 二进制 --> 十进制
}
a[i] = tmp;
}
sort(a, a + n);
ll pos = ((1ll<<m)-1-n) / 2;
for (int i = 0; i < n; ++i)
{
if(a[i] <= pos)
pos++;
}
string ans(m,'0');
for(int i = m-1; i >= 0; --i) { // 十进制 --> 二进制
ans[i] = (pos & 1) + '0';
pos >>= 1;
}
cout << ans << endl;
}
return 0;
}
这里注意下十进制二进制的相互转换代码 ( 建 议 背 诵 ) :
int x = 0;
for (int j = 0; j < m; ++j)
{
x = x*2 + s[j] - '0'; // 二进制s --> 十进制x
}
for(int i = m-1; i >= 0; --i)
{
ans[i] = (pos & 1) + '0'; // 十进制 --> 二进制
pos >>= 1;
}
[每日一题2020.06.11]Codeforces Round #644 (Div. 3) H的更多相关文章
- [每日一题2020.06.10]Codeforces Round #644 (Div. 3) ABCDEFG
花了5个多少小时总算把div3打通一次( 题目链接 problem A 题意 : 两个x*y的矩形不能重叠摆放, 要放进一个正方形正方形边长最小为多少 先求n = min(2x, 2y, x+y) 再 ...
- [每日一题2020.06.07]codeforces Round #627 (Div. 3)
problem A /* * Author: RoccoShi * Time: 2020-06-07 19:37:51 */ #include <bits/stdc++.h> using ...
- [每日一题2020.06.13]leetcode #739 #15 单调栈 双指针查找
739 每日温度 ( 单调栈 ) 题目 : https://leetcode-cn.com/problems/daily-temperatures/ 题意 : 找到数组每一个元素之后第一个大于它的元素 ...
- [每日一题2020.06.17] leetcode周赛T3 5438 制作m束花所需的最少天数 二分搜索
题目链接 这题我开始一直在想如何在数组上dp操作搜索区间, 很蠢, 实际上用二分查找的方法可以很快的解决 首先我们通过一个函数判断第x天是否符合题意, 如果x天可以做出m束花, 那么大于m的天数必然可 ...
- [每日一题2020.06.14]leetcode #70 爬楼梯 斐波那契数列 记忆化搜索 递推通项公式
题目链接 题意 : 求斐波那契数列第n项 很简单一道题, 写它是因为想水一篇博客 勾起了我的回忆 首先, 求斐波那契数列, 一定 不 要 用 递归 ! 依稀记得当年校赛, 我在第一题交了20发超时, ...
- [每日一题2020.06.08]洛谷P1605 DFS
今天cf又杯具的只写出2题, 虽然AB题20分钟左右就搞定了, 但是CD写了2个小时也没写出来 D题我用到了DFS, 虽然必不正确, 但是我至少发现了一个问题, 那就是我连DFS都忘了, 于是怒找DF ...
- [每日一题2020.06.16] leetcode双周赛T3 5423 找两个和为目标值且不重叠的子数组 DP, 前缀和
题目链接 给你一个整数数组 arr 和一个整数值 target . 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target .可能会有多种方案,请你返回满足要求的两个子数组长度和的 ...
- [每日一题2020.06.15]P1226 【模板】快速幂取余运算
我是题目 快速幂就是快速求 \(a^b\)的一种算法 快速幂 思想 : 比如我要求 \(6^9\) 首先将幂转化为二进制形式 : \[6^9 = 6^{1001} \tag{1} \] 可以得到 : ...
- [每日一题2020.06.12]P3375 【模板】KMP字符串匹配
题目链接 关于kmp : https://www.cnblogs.com/roccoshi/p/13096988.html 关于kmp, 想了很久, 我觉得不应该放在这里写, 另开一贴记录一下. #i ...
随机推荐
- MySQL 8.0用户及安全管理
用户的功能 登录数据库 管理数据库对象 用户的组成 用户名@'白名单' 白名单: % 10.0.0.10 .% 10.0.0.5% 10.0.0.0/255.255.254.0 oldguo.com ...
- UPD链接实现稳健传输案例
使用的类 DatagramSocket 用于发送数据和接收数据 此类的构造方法: DatagramSocket(); DatagramSocket(端口号); ...
- zsh 使用通配符功能
zsh 使用通配符功能 默认情况下 zsh 是不支持通配符 (*) 匹配的: 第一步,打开zsh配置文件 $ vi .zshrc 第二步,最后一行添加下面语句到文本中,保存.退出: setopt no ...
- Java中的自动装箱拆箱
Java中的自动装箱拆箱 一.自动装箱与自动拆箱 自动装箱就是将基本数据类型转换为包装类类型,自动拆箱就是将包装类类型转换为基本数据类型. 1 // 自动装箱 2 Integer total = 90 ...
- tomcat漏洞利用总结
一.后台war包getshell 漏洞利用: tomcat在conf/tomcat-users.xml配置用户权限 <?xml version="1.0" encoding= ...
- "锁定文件失败 打不开磁盘或它所依赖的某个快照磁盘。模块启动失败。未能启动虚拟机"--解决方法
今天正在使用kali的时候,电脑突然死机了..强制重启,在进入虚拟机发现报错: "锁定文件失败 打不开磁盘或它所依赖的某个快照磁盘.模块启动失败.未能启动虚拟机." 1.问题起因 ...
- Bitwarden_rs搭建
最近LastPass网络极其不稳定,正好闲下来找到了Bitwarden_rs这个替代品,感觉不错,分享记录下部署过程. 一.Docker方式部署 #获取镜像 docker pull bitwarden ...
- DM7的聚簇索引和非聚簇索引(cluster属性)
早期的DM7或者DM8在创建带有主键的表时,默认会加上cluster属性:后期版本则全部为默认非cluster属性. 下面为显示的指定cluster属性: 1.创建主键的为聚集索引. create t ...
- hdl - HLS vs. Generator
https://mp.weixin.qq.com/s/n_4RKlOddr_p2S_wODvFbw 介绍硬件建模的各个层次,以及基于RTL进一步提高层次的方法. 1. 物理版图 直接画 ...
- MethodHandle(方法句柄)系列之一:MethodHandle和MethodType
阅读此文章的作者建议先了解java反射和动态代理. java7中为间接调用方法引入了新的api,其中最关键的是java.lang.invoke包,即方法句柄.我们可以看成是java ...