[关闭]
@PaulGuan 2016-10-08T15:22:37.000000Z 字数 688 阅读 685

J - Opposites Attract 题解

算法 题解


题目大意

有n (1 ≤ n ≤ 10^5) 个人,每个人有一个数字Ti (-10<=Ti<=10) 如果一个人和另一个人的数字为相反数(0的相反数就是0),那么则可以匹配,现在求有多少种匹配的方法。

分析

我们还是可以通过一个大小为20的一维数组,记录有Ti数字的人的数量,除0外的都可以相反数相乘即可,0用组合数C(2,T0)计算。

代码

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. using namespace std;
  5. unsigned long long flag[21];
  6. unsigned long long n,ans=0;
  7. unsigned long long jc(unsigned long long n,unsigned long long m)
  8. {
  9. unsigned long long i,ans=1;
  10. for(i=m+1;i<=n;i++)
  11. {
  12. ans*=i;
  13. }
  14. return ans;
  15. }
  16. int main(void)
  17. {
  18. memset(flag,0,sizeof(flag));
  19. cin>>n;
  20. unsigned long long i;
  21. for(i=0;i<n;i++)
  22. {
  23. unsigned long long a;
  24. cin>>a;
  25. flag[a+10]++;
  26. }
  27. for(i=0;i<=10;i++)
  28. {
  29. if(i==10)
  30. {
  31. if(flag[10]<=1)
  32. continue;
  33. ans+=jc(flag[i],flag[i]-2)/2;
  34. continue;
  35. }
  36. ans+=flag[i]*flag[20-i];
  37. }
  38. cout<<ans<<endl;
  39. return 0;
  40. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注