UVa 1152 和為0的四個值

2021-09-11 07:21:45 字數 1029 閱讀 9910

暴力o(n4)超時。

思路1:二分。

列舉所有a+b(a屬於a,依次類推),把所有 a+b 記錄下來放在乙個陣列sum中,對sum排序。然後列舉所有 -c-d ,在 sum 中二分查詢有幾個這樣的值,用upper_bound() - lower_bound() 就是個數,累計到結果中。o(n^2logn)

執行2750ms

#include #include using namespace std;

#define ll long long int

#define maxn 4005

int t,n,a[maxn],b[maxn],c[maxn],d[maxn],sum[maxn*maxn];

int main()

int& operator(int k)

}hash1;

hash1並不用很大,但是它能處理的數卻很大。這是因為過載了運算子。對於 k ,先通過位運算中的 & 將其控制在陣列上限之內,不斷雜湊,如果hash1(k)的值已經被占用且存的不是這個值,說明這個位置被其他佔了,只能繼續雜湊,直到找到空位,賦值,返回訪問次數。

#include #include using namespace std;

#define ll long long int

#define maxn 4005

int t,n,a[maxn],b[maxn],c[maxn],d[maxn];

struct hash_mp

int& operator(int k)

}hash1;

int main()

}ll ans=0;

for( int i=0; i}

printf("%lld\n",ans);

if(t) printf("\n");

}//fclose(stdin);

return 0;

}

UVa 1152 中途相遇法 和為0的四個值

從a,b,c,d 四個陣列中 每乙個陣列中有n個元素 各挑出乙個,和為0,這樣的組合有多少?顯然,o n4 的列舉太差勁了 我們採用所謂 中途相遇法 a,b陣列一組,c,d陣列一組,分別加和,得到part1和part2陣列,排序。之後在part2中二分查詢part1的每乙個元素的相反數。注意 二分查...

uva 1152 和為0的4個值(中途相遇法)

sum為0的值sum問題可以表示如下 給定四個列表a,b,c,d的整數值,計算多少個四元組 a,b,c,d a b c d是這樣的a b c d 0.在下文中,我們假設所有列表具有相同的大小n。輸入輸入以一行上的單個正整數開始,表示後面的案例數,每個案例如下所述。該行後面是乙個空行,兩個連續輸入之間...

四個數和為0(二分

題目 給出n個整數,你來判斷一下是否能夠選出4個數,他們的和為0,可以則輸出 yes 否則輸出 no input 第1行,1個數n,n為陣列的長度 4 n 1000 第2 n 1行 ai 10 9 ai 10 9 output 如果可以選出4個數,使得他們的和為0,則輸出 yes 否則輸出 no s...