UVA 1152 4 Values whose Sum is 0 (二分)

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;
    }
}
發佈了54 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章