题目:某人有N袋金币,其中第i袋内金币的数量是Ai。现在他决定选出2袋金币送给小Hi,再选2袋金币送给小Ho,同时使得小Hi和小Ho得到的金币总数相等。他想知道一共有多少种不同的选择方法。
具体来说,有多少种下标四元组(i, j, p, q)满足i, j, p, q两两不同,并且i < j, p < q, Ai+ Aj = Ap + Aq。
例如对于数组A=[1, 1, 2, 2, 2],一共有12种选法:
i j p q 1 3 2 4 1 3 2 5 1 4 2 3 1 4 2 5 1 5 2 3 1 5 2 4 2 3 1 4 2 3 1 5 2 4 1 3 2 4 1 5 2 5 1 3 2 5 1 4
input:
第一行包含一个整数N。
第二行包含N个整数,A1, A2, A3 ... AN。
对于70%的数据,1 <= N <= 100
对于100%的数据,1 <= N <= 1000, 1 <= Ai <= 1000000
eg:
5
1 1 2 2 2
output:
不同选择的数目。
eg:
12
代码举例:
- #include <iostream>
- #include <map>
- using namespace std;
- int main()
- {
- int n;
- cin >> n;
- int a[1005];
- long long con = 0;
- map<int, int> mp1;
- map<int, int> mp2;
- for(int i = 0; i < n; i++)
- {
- cin >> a[i];
- mp1[a[i]]++;
- }
- for(int i = 0; i < n; i++)
- {
- for(int j = (i+1); j < n; j++)
- {
- mp2[a[i] + a[j]]++;
- }
- }
- for(int i = 0; i < n; i++)
- {
- for(int j = (i+1); j < n; j++)
- {
- if(a[i] != a[j])
- {
- con += mp2[a[i] + a[j]] - mp1[a[j]] - mp1[a[i]] + 1;
- }
- else
- {
- con += mp2[a[i] + a[j]] - mp1[a[j]] - mp1[a[i]] + 3;
- }
- }
- }
- cout << con << endl;
- return 0;
- }