小Hi和小Ho的礼物

 

题目:小Hi和小Ho的礼物

注:【i、j、p、q】为下标


 

 个人感觉这道题是有一定难度的。读者可以参考一下【四平方和】的解题思路

 

分析过程下次补上

 

代码如下:

 1 #include <iostream>
 2 #include <unordered_map>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n, a[1000];
 8     long long ans = 0;
 9     unordered_map<int, int> cnt1, cnt2;
10     
11     cin >> n;
12     
13     //预处理cnt1,cnt1[X]表示“包含X枚金币的袋子个数”
14     for(int i = 0; i < n; i ++)
15     {
16         cin >> a[i];
17         cnt1[a[i]]++; 
18     }
19     //预处理cnt2,cnt2[X]表示“选出2个袋子,金币之和为X的选法种数”
20     for(int i = 0; i < n; i ++)
21         for(int j = i + 1; j < n; j ++)
22             cnt2[a[i] + a[j]]++;
23     
24     for(int i = 0; i < n; i ++)
25         for(int j = i + 1; j < n; j ++)
26         {
27             if(a[i] != a[j])    //容斥原理 
28                 ans += cnt2[a[i] + a[j]] - cnt1[a[i]] - cnt1[a[j]] + 1;
29             else
30                 ans += cnt2[a[i] + a[j]] - cnt1[a[i]] - cnt1[a[j]] + 3;
31         }
32     cout << ans << endl;
33      
34     return 0;
35 } 

 

运行结果如下:

 

posted on 2018-06-12 21:41  Tuple  阅读(298)  评论(0编辑  收藏  举报

导航