ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二分法之将答案转化成判定

2022-02-25 14:35:10  阅读:192  来源: 互联网

标签:right 转化成 int mid 二分法 preIdx 判定 stalls left


二分法的简单用法为 查找单调数组里的数据。
详见:
https://www.cnblogs.com/kingbuffalo/p/15500058.html

此外,如果一个问题非常难以解决,但又知道应该问题的答案具有如下性质:

  1. 存在 -∞~s 之前,答案合法 ; s~+∞:不合法。
  2. 答案具有单调性。

那么,也可以通过二分法来找到答案。
伪代码如下:

left = 答案下限
right = 答案上限
while( left < right ){
        mid = (left + right)/2;
        if ( valid(mid )) left = mid+1;
        else right = mid -1;
}
//left -1 为 最佳答案

以下为 poj 2456 ac代码

#define NMAX 100005

int stalls[NMAX];

//为每个cow查找合适的位置,如果可以都找到,则是合法的
bool isValid(int ans,int N,int C){
	int left  = 1;
	int right = N-1;
	int findCnt = 1;
	int preIdx = 0;
	for( int i=1;i<C;++i ){
		int searchV = stalls[preIdx] + ans;
		right = N-1;
		while(left<=right){
			int mid = left+((right-left)>> 1);
			if ( searchV < stalls[mid] ) right = mid-1;
			else left = mid+1;
		}
		if ( stalls[left-1] - stalls[preIdx] >= ans ){
			findCnt ++;
			preIdx = left-1;
		}else{
			if ( stalls[left] - stalls[preIdx] >= ans ){
				findCnt ++;
				preIdx = left;
			}
		}
	}
	return findCnt >= C;
}

int main(){
	int N,C;
	scanf("%d%d",&N,&C);
	for( int i=0;i<N;++i ) scanf("%d",&stalls[i]);
	sort(stalls,stalls+N);
	int left = 1;
	int right = stalls[N-1]-stalls[0];
	while( left <= right ){
		int mid = left+((right-left) >> 1);
		if ( isValid(mid,N,C) ){
			left = mid+1;
		}else{
			right = mid-1;
		}
	}
	printf("%d\n",left-1);

	return 0;
}

标签:right,转化成,int,mid,二分法,preIdx,判定,stalls,left
来源: https://www.cnblogs.com/kingbuffalo/p/15935922.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有