您的位置:首页 > 其它

HDOJ2141(map在二分搜索中的应用)

2015-08-30 11:50 302 查看
#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std ;
#define M 500 + 10
int a[M] ;
int b[M] ;
int c[M] ;
int d[M] ;
int l ;
int n ;
int m ;
map <int , bool > Map ;
void Marge()
{
for(int i = 0 ;i < l ; ++ i)
for(int j = 0 ;j < n ; ++ j)
Map[a[i] + b[j]] = 1 ;
}
bool Check(int x)
{
int tem ;
for(int i = 0 ;i <l ; ++ i)
{
tem = x - c[i] ;
if(Map.count(tem))    return    true ;
}
return false ;
}
int main()
{
int s ;
int x ;
int T = 1 ;
while(scanf("%d%d%d",&l ,&n , &m) != EOF )
{
for(int i = 0 ;i < l ; ++ i)
scanf("%d",a + i) ;
for(int i = 0 ;i < n ; ++ i)
scanf("%d",b + i) ;
for(int i = 0 ;i < m ; ++ i)
scanf("%d",c + i) ;
scanf("%d",&s) ;
printf("Case %d:\n",T ++) ;
Marge() ;
while(s --)
{
scanf("%d",&x) ;
if(Check(x)) puts("YES") ;
else puts("NO") ;
}
Map.clear() ;
}
return 0 ;
}


标准二分搜索代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std ;
const int MAX_N=500;
int a[MAX_N];
int b[MAX_N];
int c[MAX_N];
int d[MAX_N*MAX_N];
int l, n, m, s;
int main()
{
int t=0;
while(scanf("%d %d %d",&l, &n, &m)!=EOF)
{
for(int i=0; i<l; i++)
{
scanf("%d",&a[i]);
}
for(int i=0; i<n; i++)
{
scanf("%d",&b[i]);
}
for(int i=0; i<m; i++)
{
scanf("%d",&c[i]);
}
for(int i=0; i<l; i++)
{
for(int j=0; j<n; j++)
{
d[i*n+j]=a[i]+b[j];
}
}
sort(d,d+l*n);
scanf("%d",&s);
printf("Case %d:\n",++t);
while(s--)
{
int x;
scanf("%d",&x);
bool flag=false;
for(int i=0; i<m; i++)
{
if(binary_search(d,d+l*n,x-c[i]))
{
flag=true;
break;
}
}
if(flag)
{
puts("YES");
}
else
{
puts("NO");
}
}
}

return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: