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

  1. 先不管三七二十一, 删去最末尾的那n个数, 判断假设这样删除的话最后的中位数是几

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

​ 可以看到, 只要删除的数是比目前所指向的大的数, 中位数都是现在这个数, 不用变.

  1. 假如删除的为小于或等于目前所指向的值的数, 则指针++ 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的更多相关文章

  1. [每日一题2020.06.10]Codeforces Round #644 (Div. 3) ABCDEFG

    花了5个多少小时总算把div3打通一次( 题目链接 problem A 题意 : 两个x*y的矩形不能重叠摆放, 要放进一个正方形正方形边长最小为多少 先求n = min(2x, 2y, x+y) 再 ...

  2. [每日一题2020.06.07]codeforces Round #627 (Div. 3)

    problem A /* * Author: RoccoShi * Time: 2020-06-07 19:37:51 */ #include <bits/stdc++.h> using ...

  3. [每日一题2020.06.13]leetcode #739 #15 单调栈 双指针查找

    739 每日温度 ( 单调栈 ) 题目 : https://leetcode-cn.com/problems/daily-temperatures/ 题意 : 找到数组每一个元素之后第一个大于它的元素 ...

  4. [每日一题2020.06.17] leetcode周赛T3 5438 制作m束花所需的最少天数 二分搜索

    题目链接 这题我开始一直在想如何在数组上dp操作搜索区间, 很蠢, 实际上用二分查找的方法可以很快的解决 首先我们通过一个函数判断第x天是否符合题意, 如果x天可以做出m束花, 那么大于m的天数必然可 ...

  5. [每日一题2020.06.14]leetcode #70 爬楼梯 斐波那契数列 记忆化搜索 递推通项公式

    题目链接 题意 : 求斐波那契数列第n项 很简单一道题, 写它是因为想水一篇博客 勾起了我的回忆 首先, 求斐波那契数列, 一定 不 要 用 递归 ! 依稀记得当年校赛, 我在第一题交了20发超时, ...

  6. [每日一题2020.06.08]洛谷P1605 DFS

    今天cf又杯具的只写出2题, 虽然AB题20分钟左右就搞定了, 但是CD写了2个小时也没写出来 D题我用到了DFS, 虽然必不正确, 但是我至少发现了一个问题, 那就是我连DFS都忘了, 于是怒找DF ...

  7. [每日一题2020.06.16] leetcode双周赛T3 5423 找两个和为目标值且不重叠的子数组 DP, 前缀和

    题目链接 给你一个整数数组 arr 和一个整数值 target . 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target .可能会有多种方案,请你返回满足要求的两个子数组长度和的 ...

  8. [每日一题2020.06.15]P1226 【模板】快速幂取余运算

    我是题目 快速幂就是快速求 \(a^b\)的一种算法 快速幂 思想 : 比如我要求 \(6^9\) 首先将幂转化为二进制形式 : \[6^9 = 6^{1001} \tag{1} \] 可以得到 : ...

  9. [每日一题2020.06.12]P3375 【模板】KMP字符串匹配

    题目链接 关于kmp : https://www.cnblogs.com/roccoshi/p/13096988.html 关于kmp, 想了很久, 我觉得不应该放在这里写, 另开一贴记录一下. #i ...

随机推荐

  1. Java Number & Math类

    java Number类 Java的内置数据类型有byte.int.long.double等. Java 语言为每一个内置数据类型提供了对应的包装类. int对应的包装类为Integer long对应 ...

  2. Pyqt5_QmainWindow

    QmainWindow Toolbar() QMenuBar() StatusBar() ******************************************************* ...

  3. opencv3学习1:opencv3.4.10与vs2017环境配置

    原教程网址:https://jingyan.baidu.com/article/dca1fa6f13bd55f1a44052b9.html 具体教程网上很多,我也相信大家的搜素能力,作为一个初入C++ ...

  4. GRpc添加客户端的四种方式

    随着微服务的发展,相信越来越多的.net人员也开始接触GRpc这门技术,大家生成GRpc客户端的方式也各不相同,今天给大家介绍一下依据Proto文件生成Rpc客户端的四种方式 前提:需要安装4个Nug ...

  5. DQN(Deep Q-learning)入门教程(二)之最优选择

    在上一篇博客:DQN(Deep Q-learning)入门教程(一)之强化学习介绍中有三个很重要的函数: 策略:\(\pi(a|s) = P(A_t=a | S_t=s)\) 状态价值函数:\(v_\ ...

  6. Android_AndroidX简介&Junit4

    AndroidX简介: Android 9.0(API level 28)发布时,AndroidX也作为一个新的支持库发布出来了.AndroidX时Jetpack的一部分,它包含了现有的支持库和最新的 ...

  7. [Objective-C] 014_Objective-C 代码规范指南

    本文参考引用(http://www.csdn.net/article/2015-06-01/2824818-objective-c-style-guide/1) 拥有良好的编码规范,能使我们的代码保持 ...

  8. pandas手册

    https://www.dataquest.io/blog/large_files/pandas-cheat-sheet.pdf

  9. Springboot 内置tomcat 基本配置收集整理

    配置一: server:# tomcat 配置  tomcat:    # 接收队列长度    accept-count: 1000    # 最小空闲线程数    min-spare-threads ...

  10. 关于如何提高SRAM存储器的新方法

    SRAM是当今处理器上最普遍的内存.当芯片制造商宣布他们已经成功地将更多的电路封装到芯片上时,通常是较小的晶体管引起了人们的注意.但是连接晶体管形成电路的互连也必须收缩.IMEC的研究人员提出了一个方 ...