[关闭]
@sensitive-cs 2016-10-04T15:44:47.000000Z 字数 598 阅读 706

J - Opposites Attract

分析:

从n个数中任取两个数相加等于0,求取法。

思路:

独立记录0的个数,然后利用组合公式。对于相反数用两个数记录组-10到10每个数的个数,最后用一个循环相乘,还是相当于分布乘法原理嘛。

特别提醒:

由于数据范围够大,所以每个long long,血的教训。

代码:
  1. #include <stdio.h>
  2. #include <math.h>
  3. #define M 100000
  4. int a[M];
  5. long long b[11];
  6. long long c[11];
  7. long long zero = 0;
  8. int main()
  9. {
  10. long long n;
  11. while (scanf("%I64d",&n) != EOF)
  12. {
  13. long long i = 0,j = 0;
  14. long long sum = 0;
  15. for (i = 1;i <= 10;i++)
  16. {
  17. b[i] = 0;
  18. c[i] = 0;
  19. }
  20. for (i = 0;i < n;i++)
  21. {
  22. scanf("%d",&a[i]);
  23. for (j = 1;j <= 10;j++)
  24. {
  25. if (a[i] == j)
  26. b[j]++;
  27. }
  28. if (a[i] == 0)
  29. zero++;
  30. for (j = -1;j >= -10;j--)
  31. {
  32. if (a[i] == j)
  33. c[(int)fabs(j)]++;
  34. }
  35. }
  36. for (i = 1;i <= 10;i++)
  37. sum += b[i] * c[i];
  38. if (zero > 1)
  39. sum += ((zero - 1)*zero / 2);
  40. printf("%I64d\n",sum);
  41. }
  42. return 0;
  43. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注