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代码 :

  1. /*
  2. * Author: RoccoShi
  3. * Time: 2020-06-10 20:05:02
  4. */
  5. #include <bits/stdc++.h>
  6. using namespace std;
  7. typedef long long ll;
  8. ll a[105];
  9. int main() {
  10. ios::sync_with_stdio(false);
  11. cin.tie(0);
  12. int t;
  13. cin >> t;
  14. while(t--) {
  15. int n, m;
  16. cin >> n >> m;
  17. for (int i = 0; i < n; ++i)
  18. {
  19. string s;
  20. cin >> s;
  21. ll tmp = 0;
  22. for (int j = 0; j < m; ++j)
  23. {
  24. tmp = tmp*2 + s[j] - '0'; // 二进制 --> 十进制
  25. }
  26. a[i] = tmp;
  27. }
  28. sort(a, a + n);
  29. ll pos = ((1ll<<m)-1-n) / 2;
  30. for (int i = 0; i < n; ++i)
  31. {
  32. if(a[i] <= pos)
  33. pos++;
  34. }
  35. string ans(m,'0');
  36. for(int i = m-1; i >= 0; --i) { // 十进制 --> 二进制
  37. ans[i] = (pos & 1) + '0';
  38. pos >>= 1;
  39. }
  40. cout << ans << endl;
  41. }
  42. return 0;
  43. }

这里注意下十进制二进制的相互转换代码 ( 建 议 背 诵 ) :

  1. int x = 0;
  2. for (int j = 0; j < m; ++j)
  3. {
  4. x = x*2 + s[j] - '0'; // 二进制s --> 十进制x
  5. }
  1. for(int i = m-1; i >= 0; --i)
  2. {
  3. ans[i] = (pos & 1) + '0'; // 十进制 --> 二进制
  4. pos >>= 1;
  5. }

[每日一题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. poj1386有向图判断是否存在欧拉回路或者欧拉路

      有向图的图联通是指基图联通,也就是把有向图的边改成无向图然后看是否连通.判断联通可用dfs或者并查集. 题意就是给你n个由小写字母构成的字符串,问你能不能将这n个字符串连接起来,B能接在A后面的条 ...

  2. hdu2093 考试排名(还需完善)

    下面代码是借鉴的.好多的知识点等着完善 #include <iostream> #include <string> #include <algorithm> usi ...

  3. zookeeper实现分布式锁总结,看这一篇足矣(设计模式应用实战)

    分布式锁纵观网络各种各样的帖子层出不穷,笔者查阅很多资料发现一个问题,有些文章只写原理并没有具体实现,有些文章虽然写了实现但是并不全面 借这个周末给大家做一个总结,代码拿来就可以用并且每一种实现都经过 ...

  4. ActiveMQ 反序列化漏洞(CVE-2015-5254)复现

    1.运行漏洞环境 sudo docker-compose up -d 环境运行后,将监听61616和8161两个端口.其中61616是工作端口,消息在这个端口进行传递:8161是Web管理页面端口.访 ...

  5. PYTHON 黑帽子第二章总结

    基于python3编写 import sys, socket, getopt, threading, argparse, subprocess # globals options listen = F ...

  6. 使用Vue+Django+Ant Design做一个留言评论模块

    使用Vue+Django+Ant Design做一个留言评论模块 1.总览 留言的展示参考网络上参见的格式,如掘金社区: 一共分为两层,子孙留言都在第二层中 最终效果如下: 接下是数据库的表结构,如下 ...

  7. SRAM电路工作原理

    近年来,片上存储器发展迅速,根据国际半导体技术路线图(ITRS),随着超深亚微米制造工艺的成熟和纳米工艺的发展,晶体管特征尺寸进一步缩小,半导体存储器在片上存储器上所占的面积比例也越来越高.接下来宇芯 ...

  8. Mysql多个字段合并成一个返回

    可以使用CONCAT函数进行合并: SELECT CONCAT(IFNULL(t1.CITYNAME,''),IFNULL(t1.AREANAME,''),IFNULL(t1.STREETNAME,' ...

  9. ActiveMQ 笔记(二)部署和DEMO(队列、主题)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.部署操作 1. 部署在linux 上的acvtiveMQ 要可以通过前台windows 的页面访问, ...

  10. Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)

    ** 算法训练 字符串的展开 ** 题目: 在初赛普及组的"阅读程序写结果"的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于"d-h" ...