传送门HDU 2578 - Dating with girls(1)
说好的用二分的,题目看着看着我就用以前的方法了。等下再试试二分。
这个题目和哈希专题里面的一题几乎一样,事实证明我看别人的解题报告还是没有白看的。。
开一个vis数组,防止重复计算。
代码挺好理解的,就不说了。
1.土办法。。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 110000;
int num[MAXN];
int xvis[MAXN];
int main()
{
//freopen("input.txt", "r", stdin);
int T, i, j, x, y, n, k, cnt;
scanf("%d", &T);
while (T--)
{
cnt = 0;
memset(xvis, 0, sizeof(xvis));
scanf("%d%d", &n, &k);
for (i = 0; i < n; i++)
scanf("%d", &num[i]);\
sort(num, num + n);
x = n - 1, y = 0;
while (true)
{
if (num[x] + num[y] == k)
{
if (!xvis[num[x]])
{
cnt++;
xvis[num[x]] = 1;
x--, y++;
}
else
x--, y++;
}
else if (num[x] + num[y] < k)
y++;
else
x--;
if (x < 0 || y >= n)
break;
}
printf("%d\n", cnt);
}
return 0;
}
2.二分手写版
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 110000;
int num[MAXN];
int xvis[MAXN];
bool BinarySearch(int value, int n)
{
int m, x = 0, y = n;
while (x < y)
{
m = x + (y - x) / 2;
if (num[m] == value)
return true;
else if (num[m] > value)
y = m;
else
x = m + 1;
}
return 0;
}
int main()
{
//freopen("input.txt", "r", stdin);
int T, i, j, x, y, n, k, cnt;
scanf("%d", &T);
while (T--)
{
cnt = 0;
memset(xvis, 0, sizeof(xvis));
scanf("%d%d", &n, &k);
for (i = 0; i < n; i++)
scanf("%d", &num[i]);
sort(num, num + n);
for (i = 0; i < n; i++)
{
if (BinarySearch(k - num[i], n))
{
if (xvis[num[i]])
continue;
else
{
cnt++;
xvis[num[i]] = 1;
}
}
}
printf("%d\n", cnt);
}
return 0;
}
3.STL二分。。。。。(纯凑版面)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 110000;
int num[MAXN];
int xvis[MAXN];
int main()
{
//freopen("input.txt", "r", stdin);
int T, i, j, x, y, n, k, cnt;
scanf("%d", &T);
while (T--)
{
cnt = 0;
memset(xvis, 0, sizeof(xvis));
scanf("%d%d", &n, &k);
for (i = 0; i < n; i++)
scanf("%d", &num[i]);
sort(num, num + n);
for (i = 0; i < n; i++)
{
if (binary_search(num, num + n, k - num[i]))
{
if (xvis[num[i]])
continue;
else
{
cnt++;
xvis[num[i]] = 1;
}
}
}
printf("%d\n", cnt);
}
return 0;
}