zoukankan      html  css  js  c++  java
  • 2020/1/17 课堂笔记——二分

    标签(空格分隔): 课堂笔记


    二分复杂度 logN

    应用:

    1、求零点
    2、求一堆东西中的最小值的最大是多少(二分答案)


    实现时候注意整数的整除和实数的精确范围。


    例题:

    1、派
    我的生日要到了!根据习俗,我需要将一些派分给大家。我有N个不同口味、不同大小的派。有F个朋友会来参加我的派对,每个人会拿到一块派(必须一个派的一块,不能由几个派的小块拼成;可以是一整个派)。
    我的朋友们都特别小气,如果有人拿到更大的一块,就会开始抱怨。因此所有人拿到的派是同样大小的(但不需要是同样形状的),虽然这样有些派会被浪费,但总比搞砸整个派对好。当然,我也要给自己留一块,而这一块也要和其他人的同样大小。
    请问我们每个人拿到的派最大是多少?每个派都是一个高为1,半径不等的圆柱体。

    二分答案
    扫一遍派,检验够不够分,看看一共分出多少分,比F+1多就往右,少就往左。
    答案区间:[0,派的总体积比人数]

    2、抽干水塘
    公园里有n个水塘,需要把这n个水塘中的水排干,水塘中的水在自然条件下1个单位的时间可以蒸发A升水。现在买了1台抽水机,使用抽水机可以让你用1个单位的时间使每个水塘除开自然蒸发的A升水外,还可抽B升水,但在1个单位的时间内只能对1个水塘使用。
    要你求出排干所有水塘的最少时间(水塘中的水为0时为排干)

    二分时间,
    答案区间[0,个人认为是最大池塘蒸发所用时间(老师说大点也没事二分快)]
    检验答案,看蒸发A的体积能把哪些池塘蒸干,
    然后将剩余的池塘用水抽干,需要多长时间
    注意每个单位时间只能抽一个池塘

    3、序列积第m小元素
    给出两个长度为n的数组A和B, 在A和B中各任取一个, 可以得到n×n个积. 求第m小的元素。
    n<=100000
    二分答案
    先排个序(sort一下)
    首先按顺序枚举i,
    固定(a_i)之后,看有多少个b的元素满足(a_i)*(b_i)<=x(x为二分的答案,就是一个乘积)
    复杂度nlognlogm
    优化:双指针。复杂度nlogm,因为i和j是满足j随i增加而减小的关系的

    bool check(int x)
    {
        int cnt = 0;
        int j = n;
        for(int i = 1; i <= n; i++){
            while(j>0&&b[j]*a[i]>x)               
              j--;
            //i在增大时j一定会减小,所以在i时可以从i-1的j时枚举j
            cnt+=j;
        }
        return cnt>=m;
    }
    
    

    几道noip真题

    NOIP2015跳石头

    poj2728 Desert King

    poj 2976 Dropping tests

  • 相关阅读:
    个人作业——软件工程实践总结作业
    用户调查报告
    β总结
    凡事预则立
    学习进度条
    作业八——单元测试练习(个人练习)
    作业七——“南通大学教务管理系统微信公众号” 用户体验分析
    作业六——团队作业(学生成绩录入系统设计与实现)
    作业5——需求分析(学生成绩录入系统)
    作业4.2:结对项目—— 词频统计(第二阶段)
  • 原文地址:https://www.cnblogs.com/qmings/p/12204245.html
Copyright © 2011-2022 走看看