#include
#define MAXN 500+10
int n,m;
long int a[MAXN],b[MAXN],c[MAXN],d[MAXN],cd[MAXN*MAXN];
void sort(long int a[],int xx,int yy)
{
if(xx>=yy)return;
int x=xx,y=yy,k=a[xx];
while(x
{
while(a[y]>=k)
{
if(x<y)y--;
else break;
}
a[x]=a[y];
while(a[x]<=k)
{
if(x<y)x++;
else break;
}
a[y]=a[x];
}
a[x]=k;
sort(a,xx,x-1);
sort(a,x+1,yy);
}
int binarysearch(long int a[],int x,int H,int T)//二分搜索
{
int i=H+(T-H)/2;
if(a[i]==x||a[T]==x||a[H]==x)return 1;
else if(T==H+1)return 0;
else if(H==T)return 0;
else if(x>a[i]) return binarysearch(a,x,i,T);
else if(x<a[i]) return binarysearch(a,x,H,i);
}
int main()//主函数
{
freopen("C:\Users\helloworld\Desktop\putin.txt","r",stdin);
int T;
int i,j,k,numcd=0;
scanf("%d",&T);//循环T次
for(int loop=0;loop<T;loop++)
{
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{scanf("%d",&a[i]);}
for(i=0;i<n;i++)
{scanf("%d",&b[i]);}
for(i=0;i<n;i++)
{scanf("%d",&c[i]);}
for(i=0;i<n;i++)
{scanf("%d",&d[i]);}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cd[numcd++]=c[i]+d[j];
}
}
sort(cd,0,numcd-1);//为cd的枚举组合排序
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
int need=m-(a[i]+b[j]);
if(binarysearch(cd,need,0,numcd-1))
{
printf("YES\n");
break;
}
}
if(j!=n)break;
}
if(i==n)printf("NO\n");
numcd=0;
}
return 0;
/*sort(d,0,n-1);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
{
int x=m-a[i]-b[j]-c[k];
if(binarysearch(d,x,0,n-1))
{printf("YES\n");break;}
}
if(k!=n)break;
}
if(j!=n)break;
}
if(i==n)
{printf("NO\n");}
//binarysearch(d[MAXN],)
}
return 0;*/
}
题目是这样的:
输入的第一行是一个整数T(0<T≤20),代表接下来有T组数据。
每组数据的第一行有两个整数n,m(0<n<500, m为非负整数),n代表每个能量槽电力输出大小的种数,m代表山岭巨人的生命值。
接下来4行,每行有n个数代表该能量槽可选的电力输出大小。可选的电力输出大小ai满足0≤ai<10^9。
详情参看样例输入。
Output
每组数据输出一行,若存在至少一种搭配方式使总伤害刚好等于山岭巨人的生命值则输出“YES”,否则输出“NO”(不包含双引号)。
Sample Input
2
3 16
3 4 5
2 3 4
4 2 3
4 5 6
1 10
1
2
3
11
求帮忙,应该不是很难懂,我的程序