UVA_11524
題意
給出A B C D四個集合,要求從每個集合中選擇a b c d使得a+b+c+d=0。
問有多少種選擇方法?
解決
可以使用HASH來做,我還不會/(ㄒoㄒ)/~~
參考下別人的博客,這個方法很妙^_^
1. 意識到O(n^4)的算法會超時
2. 通過枚舉a+b的所有可能,查找-c-d的個數,累加即可
3. 注意數組比較大,開在全局裏面
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=4005;
int a[maxn],b[maxn],c[maxn],d[maxn],sum[maxn*maxn]; //數組比較大,不開全局會存不下
int main()
{
int cases;
scanf("%d",&cases);
while(cases--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
int cnt=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
sum[cnt++]=a[i]+b[j]; //枚舉a+b
}
}
sort(sum,sum+cnt);
long long ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
ans+=upper_bound(sum,sum+cnt,-c[i]-d[j])-lower_bound(sum,sum+cnt,-c[i]-d[j]);
//upper返回第一個嚴格大於它的值,lower返回的是第一個大於等於它的值,相減就是這個值出現的次數
//妙哉妙哉!!!
}
}
cout<<ans<<endl;
}
}