这道题目和上午做的那道题目一样也是用的hash方法解决,
'百元买百鸡'的问题。发现了只要是这种问题用while (f[p] && g[p] != key)
这种hash的方法就可以解决。
这期间我又学到了一些基本的知识点,比如说,break只能终止一层循环,对于多层就不行了。
这个我居然一直都不知道,这说明什么,自己走的弯路,错路还是太少,或者是自己刚开始学习的时候就
没有意识到这个问题,所以导致自己没有弄清楚break的用法。
学到知道是一种很奇妙的感觉,贴出代码:
第一种,用goto,类似于3个break:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
using namespace std;
const int MAXN = 400005;
/*
*以后还是用__int64好一些
*毕竟现在所有的平台都是在windows下搭建的,用__int64速度还是快一些,
*说不定题目就是卡的这个呢.
*/
__int64 a[10][222];
__int64 sum;
bool f[MAXN];
__int64 g[MAXN];
int hash(__int64 k)
{
int p = k % MAXN;
if (p < 0)
{
p += MAXN;
}
while (f[p] && g[p] != k) //这个思想还是比较重要的,可以唯一确定一个key所对应的具体值
{
p = (p + 1) % MAXN;
}
return p;
}
int main()
{
int T;
int N;
scanf("%d", &T);
while (T--)
{
int p;
memset(f, 0, sizeof(f));
scanf("%d", &N);
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < N; j++)
{
scanf("%I64d", &a[i][j]);//用I64d还是快一些.
}
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
sum = a[0][i] + a[1][j];
p = hash(sum);
f[p] = 1;
g[p] = sum;
}
}
int flag = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
for (int k = 0; k < N; k++)
{
sum = -(a[2][i] + a[3][j] + a[4][k]);
p = hash(sum);
if (f[p])
{
printf("Yes\n");
goto z; //这个能极大的提高速度. 而break只能跳出一层循环..悲剧了.
}
}
}
}
printf("No\n");
z:;
}
// system("pause");
return 0;
}
第二种,用的是三个break:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
using namespace std;
const int MAXN = 400005;
/*
*以后还是用__int64好一些
*毕竟现在所有的平台都是在windows下搭建的,用__int64速度还是快一些,
*说不定题目就是卡的这个呢.
*/
__int64 a[10][222];
__int64 sum;
bool f[MAXN];
__int64 g[MAXN];
int hash(__int64 k)
{
int p = k % MAXN;
if (p < 0)
{
p += MAXN;
}
while (f[p] && g[p] != k) //这个思想还是比较重要的,可以唯一确定一个key所对应的具体值
{
p = (p + 1) % MAXN;
}
return p;
}
int main()
{
int T;
int N;
scanf("%d", &T);
while (T--)
{
int p;
memset(f, 0, sizeof(f));
scanf("%d", &N);
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < N; j++)
{
scanf("%I64d", &a[i][j]);//用I64d还是快一些.
}
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
sum = a[0][i] + a[1][j];
p = hash(sum);
f[p] = 1;
g[p] = sum;
}
}
int flag = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
for (int k = 0; k < N; k++)
{
sum = -(a[2][i] + a[3][j] + a[4][k]);
p = hash(sum);
if (f[p])
{
flag = 1;
break; //我都泪奔了,到现在才知道break仅仅只是跳出一层的循环。
}
}
if (flag == 1)
{
break;
}
}
if (flag == 1)
{
break;
}
}
if (flag == 1)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
// system("pause");
return 0;
}