测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A21387. 小红收集了 n颗神奇的能量宝石,每颗宝石可能是正能量宝石(红色)或负能量宝石(蓝色)。当一颗红色宝石和一颗蓝色宝石的能量值绝对值相等时,它们可以配对产生强大的能量波。小红想知道她有多少种不同的宝石配对方案可以产生能量波?注意:能量值为0的宝石不能与其他能量值为非0的宝石配对,但可以与其他能量值为0的宝石配对。

填空题 较难

题目描述

题目描述

小红收集了 n颗神奇的能量宝石,每颗宝石可能是正能量宝石(红色)或负能量宝石(蓝色)。当一颗红色宝石和一颗蓝色宝石的能量值绝对值相等时,它们可以配对产生强大的能量波。

小红想知道她有多少种不同的宝石配对方案可以产生能量波?

注意:能量值为0的宝石不能与其他能量值为非0的宝石配对,但可以与其他能量值为0的宝石配对。

输入格式

第一行包含一个整数 n,表示能量宝石数量。第二行包含 n 个整数,分别表示每个能量宝石的能量值,为了方便表示,正能量宝石的能量值用正数表示,负能量宝石的能量值用负数表示。(0能量宝石是0)

输出格式

输出包含一个整数,表示小红的可选择方案数量。

样例输入 1

7 
1 1 -1 -1 2 0 0

样例输出 1

5 
2

样例输入2

10 
1 2 1 -2 -1 2 -2 1 -1 2

样例输出2

12

样例1解释

以下用输入的顺序编号表示选择的宝石,方案为:(1, 3), (1, 4), (2, 3), (2, 4), (6, 7)。

参考答案

#include <bits/stdc++.h> using namespace std; /* 全局常量和变量 */ const int N=3e2+10;   // 假设能量值的绝对值不会超过 100 long long n, cnt[N];      // cnt[i] 用来记录能量值映射后的出现次数 void solve() {     cin>>n;     // 读取 n 个能量值并分类计数     for (int i=1; i<=n; ++i) {         int x;         cin>>x;         if (x>=0)             cnt[x]++;             // 非负值直接用下标 x 计数         else             cnt[100+abs(x)]++;    // 负值映射到 100+|x|     }     // 先统计零值宝石两两配对的方案数     // cnt[0] 为能量值 0 的宝石数     long long ans=cnt[0] * (cnt[0] -1) /2;     // 再统计所有正负值绝对值相等的配对数     // 正值 v 在 cnt[v],负值 -v 在 cnt[v+100]     for (int v=1; v<=100; ++v) {         ans+=cnt[v] * cnt[v+100];     }     cout<<ans; } int main() {     ios::sync_with_stdio(false);     cin.tie(nullptr);     solve();     return 0; }
上一题 下一题