hdu 2141
2017-06-04 12:37
246 查看
题目思路:
见题目描述;
基本思路:
降低时间复杂度;想将两个数组相加时间复杂度为n^2,然后排序logn,然后找n*logn,总的是n^2;
代码如下:
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 500+10;
int num1,num2,num3;
__int64 a[maxn],b[maxn],c[maxn];
__int64 temp[250000+10];//考虑到可能一加就超出了int的范围,所以用__int64,以后如果出现蜜汁错误,可能就是数据范围出错了,勿忘是maxn*maxn;
bool bsearch(int left,int right,int value)
{
int middle;
while(right>left)
{
middle=left+(right-left)/2;
if(temp[middle]==value) return true;
else if(temp[middle]>value) right=middle;//这一定得注意;
else left=middle+1;
}
return false;
}
int main()
{
int cnt=1;
while(scanf("%d%d%d",&num1,&num2,&num3)==3)
{
for(int i=0;i<num1;i++)
{
scanf("%I64d",&a[i]);
}
for(int j=0;j<num2;j++)
{
scanf("%I64d",&b[j]);
}
for(int k=0;k<num3;k++)
{
scanf("%I64d",&c[k]);
}
int pos=0;
for(int j=0;j<num2;j++)
{
for(int k=0;k<num3;k++)
{
temp[pos++]=b[j]+c[k];
}
}
sort(temp,temp+pos);
int num;
scanf("%d",&num);
printf("Case %d:\n",cnt++);
while(num--)
{
int ans;
scanf("%d",&ans);
int ok=0,tt;
for(int i=0;i<num1;i++)
{
tt=ans-a[i];
if(bsearch(0,pos,tt))
{
ok=1;
break;
}
}
if(ok) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
见题目描述;
基本思路:
降低时间复杂度;想将两个数组相加时间复杂度为n^2,然后排序logn,然后找n*logn,总的是n^2;
代码如下:
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 500+10;
int num1,num2,num3;
__int64 a[maxn],b[maxn],c[maxn];
__int64 temp[250000+10];//考虑到可能一加就超出了int的范围,所以用__int64,以后如果出现蜜汁错误,可能就是数据范围出错了,勿忘是maxn*maxn;
bool bsearch(int left,int right,int value)
{
int middle;
while(right>left)
{
middle=left+(right-left)/2;
if(temp[middle]==value) return true;
else if(temp[middle]>value) right=middle;//这一定得注意;
else left=middle+1;
}
return false;
}
int main()
{
int cnt=1;
while(scanf("%d%d%d",&num1,&num2,&num3)==3)
{
for(int i=0;i<num1;i++)
{
scanf("%I64d",&a[i]);
}
for(int j=0;j<num2;j++)
{
scanf("%I64d",&b[j]);
}
for(int k=0;k<num3;k++)
{
scanf("%I64d",&c[k]);
}
int pos=0;
for(int j=0;j<num2;j++)
{
for(int k=0;k<num3;k++)
{
temp[pos++]=b[j]+c[k];
}
}
sort(temp,temp+pos);
int num;
scanf("%d",&num);
printf("Case %d:\n",cnt++);
while(num--)
{
int ans;
scanf("%d",&ans);
int ok=0,tt;
for(int i=0;i<num1;i++)
{
tt=ans-a[i];
if(bsearch(0,pos,tt))
{
ok=1;
break;
}
}
if(ok) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
相关文章推荐
- HDU-2141
- hdu 2141 Can you find it? (二分查找)
- hdu 2141 Can you find it? (二分法)
- HDU 2141 Can you find it?(二分)
- HDU 2141 can you find it?
- HDU-2141(二分查找_创新)
- hdu 2141 Can you find it? 二分查找
- hdu 2141 Can you find it?
- (HDU - 2141)Can you find it?
- Can you find it? hdu 2141
- HDU-2141(二分搜索)
- HDU 2141 Can you find it?
- hdu_2141_Can you find it?(二分)
- HDU2141
- hdu 2141 Can you find it?
- HDU 2141 Can you find it? (二分查找)
- hdu 2141 Can you find it? 二分查找
- hdu 2141 Can you find it?(二分法)
- HDU 2141 Can you find it?(二分)
- 【HDU】2141 - Can you find it?(STL)