欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【CTGUOJ】二分搜索

程序员文章站 2024-03-19 21:44:46
...

题目大意,有三捆网线,每一捆里面网线长度不一样,输入l,n,m表示三捆网线中分别有几根网线,输入s表示要查找的次数,输入s个数,查找能不能从三捆网线中分别拿出一根凑成要需要的长度

感悟就是:要注意细节

最后一个数组需要排序

low high的初始化要在双重循环里面

low<= high

#include <iostream>
#include <algorithm>
using namespace std;
#define N 1000
int a[N],b[N],c[N];
int wen[1005];
int l,n,m;
int s;
bool judge(int x){
	int low,high;
	for(int i = 0; i < l; i++){
		for(int j = 0; j < n; j++){
			low = 0; high = m - 1;
			int temp = x - a[i] - b[j];
//			cout<<"temp"<<temp<<endl;
			while(low <= high){//二分查找 
				int mid = (low + high) / 2;
				if(c[mid] == temp){
					return true;
				}else if(c[mid] > temp){
					high = mid - 1;
				}else 
					low = mid + 1;
			} 
		}
	}
	return false;
}
int main(){	
	cin>>l>>n>>m;
	for(int i = 0; i < l; i++)
		cin>>a[i];
	for(int i = 0; i < n; i++)
		cin>>b[i];
	for(int i = 0; i < m; i++)
		cin>>c[i];
	sort(a,a+l);
	sort(b,b+n);
	sort(c,c+m);
	cin>>s;
	for(int i = 0; i < s; i++){
		cin>>wen[i];
	}
	for(int i = 0; i < s; i++){
		if(judge(wen[i])) cout<<"Yes"<<endl;
		else cout<<"No"<<endl; 
	}
	return 0;
}

 

相关标签: e