随笔分类 - 二分
摘要:题目1502:最大值最小化(二分答案)九度OJJavaimport java.util.Scanner; public class Main { public static int max(int x ,int y){ return x > y ? x : y; } public static int solve(int tot , int m , int n ,int a[]){ int low = 1 , high = tot; while(low <= high){ int mid = (...
阅读全文
摘要:LCA + 二分(很好的题目,思维难度和编程技巧兼具的一题,但是写起来又不会太麻烦,好题!)思路参考了网上题意:略,就是点间可以跳跃,但是不能越过两个点,每次跳跃的距离就是两点的距离 * 21.一般很容易想到,可以把一个状态看成一个点,那么状态间的转移就可以看做点间的连边,而且应该是无向边,应该两个状态是可以转化的。但是想到这里还不够,如果能想到这个图其实是个二叉树那么就完美了,而且应该说是一个无限深的二叉树,而且每个节点都有两个儿子,不会只有1个为什么会是一个二叉树,是因为对于每个状态,它都一定只会有3种或2种转移可能。对于一个状态,我们将3个点排好序,x < y < z如果y
阅读全文
摘要:二分题意:给出n条线段,以米的单位给出,小数点后两位(精确到厘米),要你对这些线段裁剪,裁剪出m条等长的线段,并且让这些线段尽可能长另外线段的长度不能小于1厘米,如果筹不够m条,输出0.00做法就是二分答案,但是二分的区间有讲究一开始我认为长度的上限应该是 min { len[i] },即最短的那条线段,后来才想到是错的,应该是max{ len[i] },因为有一点想当然了,认为裁剪线段,就是每条线段都要裁剪,其实不是的,并不是每条线段都要裁剪好像4 22.003.004.00答案是2.00吗?不是的,应该是3.00,虽然3.00大于第一条线段的长度,那么就不要裁剪第1条线段,直接从第2,第3
阅读全文
摘要:二分比较好的二分题目,需要花点脑筋想到,另外写的细节也多题意:比较好懂,a数组有n个元素,b数组有m个元素,a数组的元素分别和b数组的元素相乘得到新的元素,那么一共会得到n*m个元素,将这些元素降序排序,找到第k大的元素是谁为检验算法正确性,一个暴力的程序很容易写出来,关键是正解是什么,ab数组的元素个数都很多,暴力会超时,而且空间也不允许使用二分,而且是嵌套的二分,两个二分的目的不同外层二分是位了枚举答案,内层二分是检验当前的答案是否符合做法:先将ab数组降序排序,那么我们知道a[1]*b[1]是最大值,a[n]*b[m]是最小值,其他元素的乘积一定在这个区间内,我们并不知道答案是多少,所以
阅读全文
摘要:二分, 数学用分段的思想解决定义3个数组len[i]表示i这个数字有多少位,len[1-9] = 1,因为个位数只有1为,len[10-99] = 2,有两位………………num[i]表示1到i,一共占了几位,num[9]=9,因为123456789,num[10] = 11, 12345678910sum[i] = num[1]+num[2]…………num[i]sum[4] = 10 , 因为1121231234所以对于一个位置n,用分段的思想,不断缩小范围先找到sum[m] <= n && n < sum[m+1]然后求出差值 delta = n - sum[m]
阅读全文