简单题;
就是求有多少个xy之后为k,(注意啊,可能有相同元素啊!!!,坑被了)
直接枚举费时(不知道会不会超,自己试吧)。
优化:可以排序,然后找到a[0]+a[i]>=k的点,说明只需在0-i之间搜,
搜的时候可以2分,但既然排序了,就可以这样做:
d从0-i;a[d]+a[i] ? k
1.如果大于;搜(d , i-1);
2.如果等,总加1;搜(d+1,i-1);
3.如果小于,说明a[d]不可能匹配了,搜(d+1,i);
我写的直接从0-i搜,怕出现2+2=4的情况
#include<stdio.h>
#include<stdlib.h>
int cmp (const void *a,const void *b)
{
return *(__int64 *)a>*(__int64 *)b ? 1:-1;
}
int main ()
{
__int64 t,n,d,k,i,m,s,f,a[100002];
scanf("%I64d",&t);
while(t--)
{
scanf("%I64d%I64d",&n,&k);
for(i=0;i<n;i++)
scanf("%I64d",&a[i]);
qsort(a,n,sizeof(a[0]),cmp);
for(i=0;i<n;i++)
if(a[0]+a[i]>=k)
break;
m=i;
s=f=0;
for(d=0;d<=m;d++)
{
if(d&&a[d]==a[d-1])
continue;
for(;i>=0;i--)
{
if(a[d]+a[i]<=k)
{
if(a[d]+a[i]==k)
s++;
i++;
break;
}
}
}
printf("%I64d\n",s);
}
return 0;
}