简单的 排序+二分水题,不过TLE和WA了快10次,TLE原因有冒泡超时,数据量达100000,O(n^2)的冒泡肯定超时,奈何我只会写冒泡( ▼-▼ ),只好用sort()了。WA原因:①没考虑a[0] = a[1] = 3,k = 6这种情况,输出应该是1的,应该要判断a[i] != a[i-1]。那么问题来了,继续WA......原因是i == 0时数组下标 i-1 < 0。C语言是允许数组下标取负数的,相当于 *(a-1)。
下面是AC代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <cmath>
using namespace std;
int a[100050];
void bubbleSort(int start, int last)
{
for(int i = 0; i < last-1; ++i)
for(int j = 0; j < last-i-1; ++j)
if(a[j] > a[j+1])
{
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
bool binarySearch(int start, int last, int k)
{
while(start < last)
{
int mid = start+(last-start)/2;
if(a[mid] == k)
return true;
else if(a[mid] > k)
last = mid;
else
start = mid+1;
}
return false;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n, k;
scanf("%d %d", &n, &k);
for(int i = 0; i < n; ++i)
scanf("%d", a+i);
sort(a, a+n);
int ans = 0;
for(int i = 0; i < n; ++i)
if(binary_search(a, a+n, k-a[i]))
{
++ans;
if(i==0)
{
}
else if(a[i]==a[i-1])
{
--ans;
}
}
cout << ans << endl;
}
return 0;
}