题目:小Hi和小Ho的礼物
注:【i、j、p、q】为下标
个人感觉这道题是有一定难度的。读者可以参考一下【四平方和】的解题思路
分析过程下次补上
代码如下:
#include <iostream>
#include <unordered_map>
using namespace std; int main()
{
int n, a[];
long long ans = ;
unordered_map<int, int> cnt1, cnt2; cin >> n; //预处理cnt1,cnt1[X]表示“包含X枚金币的袋子个数”
for(int i = ; i < n; i ++)
{
cin >> a[i];
cnt1[a[i]]++;
}
//预处理cnt2,cnt2[X]表示“选出2个袋子,金币之和为X的选法种数”
for(int i = ; i < n; i ++)
for(int j = i + ; j < n; j ++)
cnt2[a[i] + a[j]]++; for(int i = ; i < n; i ++)
for(int j = i + ; j < n; j ++)
{
if(a[i] != a[j]) //容斥原理
ans += cnt2[a[i] + a[j]] - cnt1[a[i]] - cnt1[a[j]] + ;
else
ans += cnt2[a[i] + a[j]] - cnt1[a[i]] - cnt1[a[j]] + ;
}
cout << ans << endl; return ;
}
运行结果如下: