用二分枚举答案题

以二分算法枚举答案的方法非常高效,枚举所需的时间复杂度只需O(logN)

设x为答案,check(x)只有真假两种取值。

能够使用二分枚举算法的条件:

存在一个X,当x小于X时和x大于X时,check(x)真假值不一样。

二分枚举即能够找出真假之间的边界,这个就是所求在满足题意下的最值了。

如果x是浮点数,那么边界的取值注意精度即可。

const double eps=1e-7;
while(l+eps<r)
{	mid=(l+r)/2;
	if(check(mid))	l=mid;
	else r=mid;
}

如果x是整数,那么注意所求,是真值区的最大值还是最小值,见例题。

例题:https://www.nowcoder.com/acm/contest/52/E

AC代码:

#include<iostream>
#include<algorithm>
using namespace std;
int c[10005],v[10005];
long long p[10005];
int n,k;

bool check(int x)
{	for(int i=0;i<n;i++)
		p[i]=v[i]-x*c[i];
	sort(p,p+n);
	long long sum=0;
	for(int i=n-1;i>=n-k;i--)
		sum+=p[i];
	return sum>=0;
}

int main()
{
   int T;
   scanf("%d",&T);
   while(T--)
   {

		 scanf("%d%d",&n,&k);
		for(int i=0;i<n;i++)
			scanf("%d%d",&c[i],&v[i]);
		int l=0,r=100000,mid,res;
		while(l<=r)
		{	mid=(l+r)/2;
			if(check(mid))
			{	res=mid;
				l=mid+1;

			}
			else r=mid-1;

		}
		printf("%d\n",res);
   }
    return 0;
}

  

时间: 2024-10-09 06:31:17

用二分枚举答案题的相关文章

Brownie Slicing(二分枚举答案)

描述 Bessie has baked a rectangular brownie that can be thought of as an RxC grid (1 <= R <= 500; 1 <= C <= 500) of little brownie squares.The square at row i, column j contains N_ij (0 <= N_ij <= 4,000) chocolate chips.Bessie wants to par

POJ 2112—— Optimal Milking——————【多重匹配、二分枚举答案、floyd预处理】

Optimal Milking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2112 Description FJ has moved his K (1 <= K <= 30) milking machines out into the cow pastures among the C (1 <= C <= 20

集训第四周(高效算法设计)N题 (二分查找优化题)

原题:poj3061 题意:给你一个数s,再给出一个数组,要求你从中选出m个连续的数,m越小越好,且这m个数之和不小于s 这是一个二分查找优化题,那么区间是什么呢?当然是从1到数组长度了.比如数组长度为10,你先找5,去枚举每一个区间为5的连续的数,发现存在这样的数,那么就可以继续往左找,反之则往右找,直到左右区间重合,即为正确答案,(有可能是右区间小于左区间,所以每次都应该求区间中点值) #include"iostream" #include"set" #incl

【noi 2.2_7891】一元三次方程求解(二分枚举)

对于noi上的题有2中解法: 1.数据很小(N=100),可以直接打for循环枚举和判断. 2.不会“三分”,便用二分.利用“两根相差>=1”和 f(x1)*f(x2)<0,转换意思为[x,x+1]内不会包含两个根,这样枚举可以保证不漏解.因此,枚举一个个根所在的区间,再用二分枚举找出根.其中,若N=10^5,由于保留2位小数,最好精确到4位小数计算.时间复杂度 O(N)=10^5+3*log(10^4),约为10^5. 以下附上二分的代码—— 1 //20160908 Ann 2 #incl

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&#39;s problem(manacher+二分/枚举)

HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分相同,第一部分与第二部分对称. 现在给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法,求出以第i个点为中心的回文串长度,记录到数组p中 要满足题目所要求的内容,需要使得两个相邻的回文串,共享中间的一部分,也就是说,左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样. 因为我们已经记录下来以

!HDU 4282 A very hard mathematic problem-卡时间-(二分枚举)

题意:x^z+y^z+xyz=k,给定k求出满足该式子的x,y有多少种.(x<y,z>1,k<2^31) 分析: 一看就是卡时间的题,这种题一般方法是枚举,但是要先分析一下数据的关系,把枚举的变量的数据范围缩小到可接受的程度:另外二分在这种题里是常用的方法. 本题要复杂一点,有三个变量都要枚举.首先z作为幂,而k<2^31,所以z不可能超过31:其次考虑z取最小值2的情况,此时有(x+y)^2=k,估算得x+y<=10^4.5,也就是x+y不超过40000,这就把x和y的范围

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&amp;#39;s problem(manacher+二分/枚举)

pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法.求出以第i个点为中心的回文串长度.记录到数组p中 要满足题目所要求的内容.须要使得两个相邻的回文串,共享中间的一部分,也就是说.左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也

寒假week1---二分查找(二分枚举)

寒假week1---二分查找(二分枚举)1.适用条件:要查找(枚举)的集合有序 && 查找(枚举)的"条件"具有单调性2.什么是"条件":example: 1.给定一个有序数组,从中查找数字7的下标.条件是:这个数字等于7. 2.给定一个有序数组,从中查找满足函数f(x)<99的数字的下标.条件是:f(x)<99.3.什么是"满足条件": 在上述例1中,所有等于7的数字都是满足条件的,例2中所有f(x)<99的x

HDU 4430 &amp; ZOJ 3665 Yukari&#39;s Birthday(二分+枚举)

题目链接: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4430 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4888 Problem Description Today is Yukari's n-th birthday. Ran and Chen hold a celebration party for her. Now comes the most import