2020/1/17 课堂笔记——二分

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

猜你喜欢

转载自www.cnblogs.com/qmings/p/12204245.html
今日推荐