hdu 2141
来源:互联网 发布:林小宅的淘宝店叫什么 编辑:程序博客网 时间:2024/05/24 07:37
题目思路:
见题目描述;
基本思路:
降低时间复杂度;想将两个数组相加时间复杂度为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
- HDU 2141
- hdu 2141
- HDU 2141
- hdu 2141
- hdu 2141
- hdu 2141
- hdu 2141
- hdu 2141
- HDU 2141
- hdu 2141
- HDU-2141
- HDU-2141
- hdu 2141
- hdu 2141
- HDU 2141 二分
- hdu 2141 纯水题
- python基本语法:序列
- 解决windows10 wireshark无法抓取发出去的包只能抓取接受数据包
- C++ const相关
- 十三周 Dynamic programming counting bits
- CentOS 7中源码安装MySQL 5.7.6+详细教程
- hdu 2141
- AWT高仿计算器
- Android——有序广播和无序广播
- Windows系统中设置定时开关机方法
- MySQL查询语句执行的过程
- Unity 使用Photon Server 创建一个简单聊天室
- 工作流引擎Activiti学习 --- 小小总结
- 机器学习通俗入门-使用梯度下降法解决最简单的线性回归问题
- AndroidStudio TODO