第一题 二分查找
输入一个整数 n 和 n 个整数,保证这 n个整数已经按照从小到大进行排序。
然后输入一个整数 q( q≤100000)代表 q次查询。接下来 q 行,每行含有一个整数 m ,代表一次查询。对于每次查询,使用二分查找判断 m 是否在之前输入的 n个整数中出现过。如果出现,输出一行 "Yes" ,否则输出 "No" 。
思路:运用二分模板查找m
第二题 A-B数对
给出一串正整数数列以及一个正整数 C,要求计算出所有满足 A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
思路:因为C是确定的,所以可以先遍历B,再用二分法寻找A。因为ai<2的30次方,C<2的30次方,所以要用long long
第三题 分巧克力
儿童节那天有 K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有 N块巧克力,其中第 i块是 Hi×Wi的方格组成的长方形。
为了公平起见,小明需要从这 N块巧克力中切出 K块巧克力分给小朋友们。切出的巧克力需要满足:
- 形状是正方形,边长是整数。
- 大小相同。
例如一块 6×5的巧克力可以切出 6 块 2×2的巧克力或者 2 块 3×3的巧克力。
当然小朋友们都希望得到的巧克力尽可能大,你能帮小 Hi计算出最大的边长是多少么?
思路:首先check函数检验x是否能做切出巧克力边长,若满足切出巧克力数cnt>=人数k,则返回1;接着通过二分答案的方法求出最大边长;因为这题属于尽量向右寻找答案,在二分时注意mid=(l+r+1)/2.
第四题 卡牌
这天,小明在整理他的卡牌。
他一共有 n种卡牌,第 i种卡牌上印有正整数数 i(i∈[1,n]),且第 i种卡牌现有 ai 张。
而如果有 n 张卡牌,其中每种卡牌各一张,那么这 n张卡牌可以被称为一套牌。小明为了凑出尽可能多套牌,拿出了 m张空白牌, 他可以在上面写上数 i,将其当做第 i种牌来凑出套牌。然而小明觉得手写的牌不太美观,决定第 i种牌最多手写 bi 张。
请问小明最多能凑出多少套牌?
思路:因为可以用空白牌补充每种卡牌不够的数量,可以通过二分答案寻找卡牌套数最大值。需要验证空白牌的数量是否够补齐每种牌不够的数量之和,并且因为第i种牌最多手写bi张,所以还需验证假设手写bi张第i种牌能否达到mid。同时在二分时注意r的值应该是4e5,因为最大卡牌套数可能是(ai+bi)。我最开始一直r=2e5,导致多次WA。
学习总结:学习了二分法,其while(l<=r)和while(l<r)两种不同写法。还有在二分中尽量向右寻找答案和尽量向左寻找答案两种情况中mid的公式不同。