二分三分
youthinkwu
这个作者很懒,什么都没留下…
展开
-
POJ 2141 Can you find it?
题意:给出3个数组a[],b[],c[];给出s(s<1000)个询问,每个询问给出一个X,问你能不能找到一种方案,从a中拿一个数Ai,从b中拿一个数Bj,从c中拿一个数Ck,使得Ai+Bj+Ck = X. 每个数组的元素个数不超过500; 解法:如何做?暴力500* 500* 500* 1000肯定不行。可以二分。先把a和b数组合并成一个250000的数组,然后枚举Ck,二分250000的数组。原创 2015-07-19 23:50:20 · 222 阅读 · 0 评论 -
81. Search in Rotated Sorted Array II LeetCode
题意:在旋转数组中查找一个数,与之前不同的是旋转数组里面会有重复的数字出现。 题解:一样的套路,旋转之后的数组,要么是一段连续递增的,要么是两段,分情况讨论二分。class Solution { public: bool search(vector<int>& nums, int target) { int l = 0,r = nums.size() - 1;原创 2016-02-16 18:58:06 · 208 阅读 · 0 评论 -
74. Search a 2D Matrix LeetCode
题意:在一个矩阵中搜索是否存在数target,矩阵中的数字每一行递增,每一行的第一个数字都比上一行的最后一个数字大。 题解:先二分搜在那一行,然后在那一行里面二分搜索是否存在target。class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int l =原创 2016-02-15 18:48:22 · 237 阅读 · 0 评论 -
153. Find Minimum in Rotated Sorted Array LeetCode
题意:给出一个排好序的数组,然后旋转未知数次,求数组中的最小元素。 题解:你会发现,不管旋转几次,最后要么是一段完整的递增数列,要么是两段递增数列。那么我们还是可以使用二分来求。class Solution { public: int findMin(vector<int>& nums) { int l = 0,r = nums.size() - 1; wh原创 2016-02-14 18:27:44 · 188 阅读 · 0 评论 -
278. First Bad Version LeetCode
题意:寻找第一个坏的版本。坏版本之后的都是坏版本。 题解:二分。// Forward declaration of isBadVersion API. bool isBadVersion(int version);class Solution { public: int firstBadVersion(int n) { long long l = 1,r = n,mid;原创 2016-02-13 16:00:23 · 227 阅读 · 0 评论 -
POJ 3258 River Hopscotch
题意:一条河宽L,中间有n个石头,最多可以去掉m个,求最大的最小跳跃距离。 思路:二分最小值; 二分的两种类型:1求最小的最大值。2求最大的最小值。这个属于第二种。#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; int L,n,m,a[50010]原创 2015-07-20 15:28:52 · 369 阅读 · 1 评论 -
HOJ 2651 || POJ 3122 Pie
题目大意:有n个派,f个朋友。然后要将派分给自己和这f个朋友。每个 朋友得到的派的面积是一样的,派不能组合起来。也就是说一个人只能拿到1块。要使得每个人拿到的面积最大,应该怎么分?求最大面积。 思路:这可不是求平均值,其实是二分。我们可以二分最大面积,然后扫一遍所有的派,看能不能分出f+1块这个面积的派。#include <iostream> #include <cstdio> #include原创 2015-07-20 14:29:58 · 519 阅读 · 0 评论 -
POJ 3273 Monthly Expense
题意:给出把一个n个元素的数组分成小于等于m组,使得每组的和的最大值最小。 思路:二分最大值。 二分的两种类型:1求最小的最大值。2求最大的最小值。#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; int a[100010],n,m; bool ch原创 2015-07-20 15:09:47 · 304 阅读 · 0 评论 -
HDU 2438 Turn the corner
这题目有意思,给出汽车的长L和宽D,给出一个拐角的两条路的宽X,Y,问汽车能不能顺利转弯通过。 思路,汽车过去肯定是要转弯的,我们可以对汽车左边界建立直线方程 直线y的斜率为tan(θ),还经过点(0, Lsin(θ)+D/cos(θ))因此得到y的直线方程。y=xtan(θ)+Lsin(θ)+D/cos(θ) 求的PH就是当y=X(汽车当前在的街道的宽度)时,解出的x的值的绝对值。如果原创 2015-07-20 14:18:40 · 250 阅读 · 0 评论 -
POJ 1905 Expanding Rods
题意:一根棍子受热会弯曲向上,长度变成L’=(1+n* C)* L,求弯曲后的棍子中心到原来棍子的中心的距离h。 思路: θ * r = 1 / 2* L’(弧长公式) sinθ= 1 / 2 * L / r(三角函数) r^2 – ( r – h) ^ 2 = (1 / 2 * L) ^ 2(勾股定理) –> r = (4 * h ^ 2 + L ^ 2) / 8 / h;原创 2015-07-20 14:48:40 · 270 阅读 · 0 评论 -
HDU 4768 Flyer
题意:有n(n <= 20000)个社团去发传单,每个社团有3个值ai,bi,ci;一个社团只会给编号为a , a + c , a + 2* c … a + k * c <= bi 的学生发传单,a_i, b_i, c_i (smaller than 2^31, a_i <= b_i),然后所有的学生中有一个学生拿到的传单数目是奇数,其他都是偶数。让你求出这个学生的编号和他所得到的传单数目。 思路原创 2015-07-20 13:43:04 · 190 阅读 · 0 评论 -
HDU 2199 Can you solve this equation?
题意:8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y. x的范围是0到100的浮点数,给出Y,问能不能求出x。 做法:因为x的范围都是正数,因此这个函数有了单调性,不然还不知道怎么做。有了单调性就可以二分答案了。#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #includ原创 2015-07-19 23:39:21 · 214 阅读 · 0 评论 -
HDU 4004 The Frog's Games
题意:有一条河长L,中间有n个石头,一只青蛙想跳过去,它最多只能跳m次。它该如何跳,才能跳到对岸,求青蛙最小的跳跃能力。 思路:青蛙的最小跳跃力,实际上就是所有跳跃中的最大距离。这里也就是求青蛙最大距离的最小值。那我们二分青蛙的最大距离就可以了。#include <iostream> #include <cstring> #include <cstdio> #include <algorithm>原创 2015-07-20 00:12:08 · 338 阅读 · 0 评论 -
90. Subsets II LeetCode
题意:给出一个数组,会有重复元素,求这个数组的数构成的所有不重复的集合。 题解:先对数组里面的数排个序,dfs记录集合,如何不产生重复集合?当相同的元素不是第一次出现的时候,就直接往后跳,跳到与当前元素不相同为止。class Solution { public: void dfs(vector<vector<int>>& ans,vector<int>& pre,vector<int>&原创 2016-03-07 21:46:01 · 215 阅读 · 0 评论