码迷,mamicode.com
首页 > 其他好文 > 详细

hdu2141

时间:2015-08-09 12:23:29      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:输入三系列数A,B,C,输入一个数X,问是否在A,B,C中存在A[i]+B[j]+C[k]=X,存在输出YES,不存在输出NO.

本题若果采用暴力法那么复杂度为O(n3)显然会超时,如果把A和B先加起来合成一个,于是需要做加法L*M次保存在p中,然后排序复杂度为O(L*Mlog(L*M)),最后使用二分·查找在新的序列p中查找X-C[k],此过程复杂度为N*log(L*M),设L=N=M=n,则f(n)=O(n2)+O(2n2longn)+O(2n*long)=O(n2longn)

#include<iostream>
#include<algorithm>
using namespace std;
#define l 501
inline bool Find(int p[], int n,int X);
int main(){
int L, M, N, S, i,k, Case = 0, x, j, redex,temp;
bool flag;
int p1[l], p2[l], p[l*l];
while (cin >> L >> M >> N){
Case++;
redex = 0;
for (i = 0; i < L; i++)
cin >> p1[i];
for (i = 0; i < M; i++){
cin >> temp;
for (j = 0; j < L; j++){
p[redex] = temp + p1[j];
redex++;
}
} /*以上将A和B相加*/
for (i = 0; i < N; i++)
cin >> p2[i];
sort(p, p + L*M); /*将P排序*/
cin >> S;
cout << "Case " << Case << ":" << endl;
while (S--){
cin >> x;
flag = 1;
for (i = 0; i < N; i++){
if (Find(p, L*M, x-p2[i])){ //在p中扫描查找x-p2[i]
flag = 0;
cout << "YES" << endl;
break;
}
}
if (flag)
cout << "NO" << endl;
}
}
return 0;
}
bool Find(int p[], int n, int X){/*二分查找函数*/
int left=0,right=n-1,mid;
while (right>=left){
mid = (left + right)/2;
if (p[mid] == X)
return true;
else if (X<p[mid])
right = mid-1;
else
left = mid+1;
}
return false;
}

hdu2141

标签:

原文地址:http://www.cnblogs.com/tandier/p/4714724.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!