【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;
}